webdriver中常用的api(2)

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

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

一、定位一组元素

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

checkbox的html:

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

  1. from selenium import webdriver
  2. import time
  3. import os
  4. driver = webdriver.Chrome()
  5. file = "file:///"+os.path.abspath("C:/Users/朱俊锐/Desktop/课件/selenium2html/selenium2html/checkbox.html")
  6. driver.get(file)
  7. driver.maximize_window()
  8. # driver.find_element_by_id("c1").click() 非常麻烦
  9. # driver.find_element_by_id("c2").click()
  10. # driver.find_element_by_id("c3").click()
  11. inputs = driver.find_elements_by_tag_name("input")
  12. for input in inputs:
  13. if input.get_attribute("type") == "checkbox":
  14. input.click()
  15. time.sleep(4)
  16. driver.quit()

get_attribute:获得属性值。

二、多层框架/窗口定位

1.多层框架定位

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

  1. from selenium import webdriver
  2. import os
  3. import time
  4. driver = webdriver.Chrome()
  5. file = "file:///"+os.path.abspath("C:/Users/朱俊锐/Desktop/课件/selenium2html/selenium2html/frame.html")
  6. driver.get(file)
  7. driver.switch_to.frame("f1") # f1和f2是id
  8. driver.switch_to.frame("f2")
  9. driver.find_element_by_id("kw").send_keys("布格拉")
  10. driver.find_element_by_id("su").click()
  11. time.sleep(4)
  12. driver.quit()

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

  1. from selenium import webdriver
  2. import os
  3. import time
  4. driver = webdriver.Chrome()
  5. file = "file:///"+os.path.abspath("C:/Users/朱俊锐/Desktop/课件/selenium2html/selenium2html/frame.html")
  6. driver.get(file)
  7. driver.switch_to.frame("f1") # f1和f2是id
  8. driver.switch_to.frame("f2")
  9. driver.switch_to.default_content()
  10. driver.switch_to.frame("f1")
  11. driver.find_element_by_link_text("click").click()
  12. time.sleep(4)
  13. driver.quit()

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

2.多层窗口定位

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

三、层级定位

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

  1. from selenium import webdriver
  2. import os
  3. import time
  4. from selenium.webdriver.common.action_chains import ActionChains
  5. driver = webdriver.Chrome()
  6. file = "file:///"+os.path.abspath("C:\\Users\\朱俊锐\\Desktop\\课件\\selenium2html\\selenium2html\\level_locate.html")
  7. driver.get(file)
  8. ele = driver.find_element_by_id("dropdown1").find_element_by_link_text("Another action")
  9. ActionChains(driver).move_to_element(ele).perform()
  10. time.sleep(4)
  11. driver.quit()

四、下拉框处理

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

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

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

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

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

五、alert、confirm、prompt 的处理

1.对alert的处理

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

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

2.对prompt的处理

流程:

测试脚本:

  1. from selenium import webdriver
  2. import os
  3. import time
  4. driver = webdriver.Chrome()
  5. file = "file:///"+os.path.abspath("C:\\Users\\朱俊锐\\Desktop\\课件\\selenium2html\\selenium2html\\send.html")
  6. driver.get(file)
  7. driver.maximize_window()
  8. driver.find_element_by_tag_name("input").click()
  9. time.sleep(3)
  10. alert = driver.switch_to.alert
  11. alert.send_keys("朱俊锐")
  12. alert.accept() # 对应地,alert.dismiss可以取消提示框
  13. time.sleep(3)
  14. driver.quit()

六、DIV对话框的处理

流程:

测试脚本:

  1. from selenium import webdriver
  2. import os
  3. import time
  4. from selenium.webdriver.common.by import By
  5. driver = webdriver.Chrome()
  6. file = "file:///"+os.path.abspath("C:\\Users\\朱俊锐\\Desktop\\课件\\selenium2html\\selenium2html\\modal.html")
  7. driver.get(file)
  8. driver.maximize_window()
  9. time.sleep(3)
  10. driver.find_element(By.LINK_TEXT, "Click").click()
  11. time.sleep(2)
  12. div0 = driver.find_element(By.CLASS_NAME, "modal-body")
  13. div0.find_element(By.ID, "click").click()
  14. time.sleep(3)
  15. div1 = driver.find_element(By.CLASS_NAME, "modal-footer")
  16. div1.find_element(By.CLASS_NAME, "btn").click()
  17. # 还可以
  18. # buttons = div1.find_elements_by_tag_name("button)
  19. # buttons[0].click()
  20. time.sleep(3)
  21. driver.quit()

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

七、上传文件操作

脚本:

  1. from selenium import webdriver
  2. import os
  3. import time
  4. from selenium.webdriver.common.by import By
  5. driver = webdriver.Chrome()
  6. file = "file:///"+os.path.abspath("C:\\Users\\朱俊锐\\Desktop\\课件\\selenium2html\\selenium2html\\upload.html")
  7. driver.get(file)
  8. driver.maximize_window()
  9. time.sleep(3)
  10. driver.find_element_by_tag_name("input").send_keys("C:\\Users\\朱俊锐\\Desktop\\R-C.jfif")
  11. time.sleep(3)
  12. driver.quit()

注意:上传文件用send_keys()

相关文章