webdriver中常用的api(2)

x33g5p2x  于2022-06-06 转载在 其他  
字(5.8k)|赞(0)|评价(0)|浏览(614)

注:下面的操作演示的html文件,都是从某个地址中打开的,因此要注意地址中存在转义字符的可能性,用/可以避免转义,用\ 也可以避免转义。如果要统一的话最好使用\ 。

一、定位一组元素

webdriver 可以很方便的使用findElement 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用findElements 方法。

checkbox的html:

下面的脚本是将前三个checkbox的框框勾选中。注意:下面获取到的id是框框的id;或者是框框的type。
脚本:

from selenium import webdriver
import time
import os

driver = webdriver.Chrome()
file = "file:///"+os.path.abspath("C:/Users/朱俊锐/Desktop/课件/selenium2html/selenium2html/checkbox.html")
driver.get(file)
driver.maximize_window()
# driver.find_element_by_id("c1").click()  非常麻烦
# driver.find_element_by_id("c2").click()
# driver.find_element_by_id("c3").click()
inputs = driver.find_elements_by_tag_name("input")
for input in inputs:
    if input.get_attribute("type") == "checkbox":
        input.click()

time.sleep(4)
driver.quit()

get_attribute:获得属性值。

二、多层框架/窗口定位

1.多层框架定位

要求:进入到inner框架中,进行百度的搜索,因为百度的页面在inner的框架当中。

from selenium import webdriver
import os
import time

driver = webdriver.Chrome()
file = "file:///"+os.path.abspath("C:/Users/朱俊锐/Desktop/课件/selenium2html/selenium2html/frame.html")
driver.get(file)

driver.switch_to.frame("f1") # f1和f2是id
driver.switch_to.frame("f2")

driver.find_element_by_id("kw").send_keys("布格拉")
driver.find_element_by_id("su").click()

time.sleep(4)
driver.quit()

现在我们要点击到右下角的click按钮,会出现一个提示框。而该按钮是在f1的框架当中,但是此时在上面代码的基础上(在f2框架中),如何定位到f1框架中的元素?

from selenium import webdriver
import os
import time

driver = webdriver.Chrome()
file = "file:///"+os.path.abspath("C:/Users/朱俊锐/Desktop/课件/selenium2html/selenium2html/frame.html")
driver.get(file)

driver.switch_to.frame("f1") # f1和f2是id
driver.switch_to.frame("f2")
driver.switch_to.default_content()
driver.switch_to.frame("f1")
driver.find_element_by_link_text("click").click()

time.sleep(4)
driver.quit()

总结:如果页面有框架时,要层层进入,才能取得对应框架内的元素。当进入到一个框架的子框架时,又要返回去获得它父框架的元素,只能重新跳转到默认的全局页面,重新去层层进入对应的框架中拿到元素。

2.多层窗口定位

有可能嵌套的不是框架,而是窗口,还有真对窗口的方法:switch_to.window
用法与switch_to.frame 相同:driver.switch_to.window("windowName")

三、层级定位

要求:将光标移动到Another action处:

from selenium import webdriver
import os
import time
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
file = "file:///"+os.path.abspath("C:\\Users\\朱俊锐\\Desktop\\课件\\selenium2html\\selenium2html\\level_locate.html")
driver.get(file)

ele = driver.find_element_by_id("dropdown1").find_element_by_link_text("Another action")
ActionChains(driver).move_to_element(ele).perform()
time.sleep(4)
driver.quit()

四、下拉框处理

下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框,再定位到下拉框内里的选项。
例如,我们要选择下拉框下的10.69的值。

除了直接用XPath或者css_selector来直接定位到10.69的元素外,还可以通过先定位到select的元素,再定位到它下拉框的元素。

from selenium import webdriver
import os
import time
driver = webdriver.Chrome()
file = "file:///"+os.path.abspath("C:\\Users\\朱俊锐\\Desktop\\课件\\selenium2html\\selenium2html\\drop_down.html")
driver.get(file)
driver.maximize_window()
time.sleep(3)
options = driver.find_element_by_id("ShippingMethod").find_elements_by_tag_name("option")
for option in options:
    if option.get_attribute("value") == "10.69":
        option.click()
time.sleep(4)
driver.quit()

除此之外,还可以:
利用options[3] 来定位元素。

from selenium import webdriver
import os
import time
driver = webdriver.Chrome()
file = "file:///"+os.path.abspath("C:\\Users\\朱俊锐\\Desktop\\课件\\selenium2html\\selenium2html\\drop_down.html")
driver.get(file)
driver.maximize_window()
time.sleep(3)
options = driver.find_element_by_id("ShippingMethod").find_elements_by_tag_name("option")
options[2].click()
time.sleep(4)
driver.quit()

五、alert、confirm、prompt 的处理

1.对alert的处理

要求,点击该a标签后,处理弹出的alert提示。

from selenium import webdriver
import os
import time
driver = webdriver.Chrome()
file = "file:///"+os.path.abspath("C:\\Users\\朱俊锐\\Desktop\\课件\\selenium2html\\selenium2html\\drop_down.html")
driver.get(file)
driver.maximize_window()
time.sleep(2)
driver.find_element_by_id("tooltip").click()
# 先拿到处理alert的句柄
time.sleep(3)
alert = driver.switch_to.alert
alert.accept()
time.sleep(3)
driver.quit()

2.对prompt的处理

流程:

测试脚本:

from selenium import webdriver
import os
import time
driver = webdriver.Chrome()
file = "file:///"+os.path.abspath("C:\\Users\\朱俊锐\\Desktop\\课件\\selenium2html\\selenium2html\\send.html")
driver.get(file)
driver.maximize_window()

driver.find_element_by_tag_name("input").click()
time.sleep(3)
alert = driver.switch_to.alert
alert.send_keys("朱俊锐")
alert.accept() # 对应地,alert.dismiss可以取消提示框
time.sleep(3)
driver.quit()

六、DIV对话框的处理

流程:

测试脚本:

from selenium import webdriver
import os
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
file = "file:///"+os.path.abspath("C:\\Users\\朱俊锐\\Desktop\\课件\\selenium2html\\selenium2html\\modal.html")
driver.get(file)
driver.maximize_window()
time.sleep(3)
driver.find_element(By.LINK_TEXT, "Click").click()
time.sleep(2)
div0 = driver.find_element(By.CLASS_NAME, "modal-body")
div0.find_element(By.ID, "click").click()
time.sleep(3)

div1 = driver.find_element(By.CLASS_NAME, "modal-footer")
div1.find_element(By.CLASS_NAME, "btn").click()
# 还可以
# buttons = div1.find_elements_by_tag_name("button)
# buttons[0].click()

time.sleep(3)
driver.quit()

总结:在对话框中,如果处理的元素在div里面,先要获取到div标签的元素,再去获取div标签内的元素。

七、上传文件操作

脚本:

from selenium import webdriver
import os
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
file = "file:///"+os.path.abspath("C:\\Users\\朱俊锐\\Desktop\\课件\\selenium2html\\selenium2html\\upload.html")
driver.get(file)
driver.maximize_window()
time.sleep(3)

driver.find_element_by_tag_name("input").send_keys("C:\\Users\\朱俊锐\\Desktop\\R-C.jfif")
time.sleep(3)
driver.quit()

注意:上传文件用send_keys()

相关文章