• selenium 自动化测试——WebDriver API


    控制浏览器

    控制浏览器窗口大小:set_window_size()方法

    设置全屏模式下运行:maximize_window()方法

    1. from selenium import webdriver
    2. from selenium.webdriver.common.by import By
    3. import time
    4. driver = webdriver.Chrome()
    5. driver.get("http://www.baidu.com")
    6. driver.set_window_size(500, 500)
    7. time.sleep(5)
    8. driver.maximize_window()
    9. time.sleep(5)
    10. driver.quit()

    控制浏览器前进、后退:back(),forward()方法

    模拟浏览器刷新:driver.refresh()方法,模拟手动刷新(F5按键)

    常用操作方法

    • clear() 清除文本
    • send_keys(value):模拟按键输入
    • click():单击元素
    • submit():提交表单(有些搜索框不提供搜索按钮,而是通过键盘按键回车完成搜索的提交,这时候可以通过submit来实现)
    • size:返回元素尺寸
    • text:获取元素文本
    • get_attribute(name):获取属性值
    • is_displayed():设置该元素是否用户可见
    1. from selenium import webdriver
    2. from selenium.webdriver.common.by import By
    3. import time
    4. driver = webdriver.Chrome()
    5. driver.get("http://www.baidu.com")
    6. driver.maximize_window()
    7. driver.find_element(By.ID,"kw").send_keys("hello")
    8. driver.find_element(By.ID,"kw").clear()
    9. driver.find_element(By.ID,"kw").send_keys("after")
    10. ele = driver.find_element(By.ID,"su")
    11. print("info: text:",ele.text, ";size:", ele.size)
    12. driver.find_element(By.ID,"su").submit()
    13. time.sleep(5)
    14. driver.quit()

    鼠标操作

    webdriver中,与鼠标相关的操作都封装在ActionChains类中。

    ActionChains类提供了常用的鼠标操作的方法:

    • perform():执行ActionChains类中存储的所有行为
    • context_click():右击
    • double_click():双击
    • drag_and_drop():拖动
    • move_to_element():鼠标悬停
    1. from selenium import webdriver
    2. from selenium.webdriver import ActionChains
    3. from selenium.webdriver.common.by import By
    4. import time
    5. driver = webdriver.Chrome()
    6. driver.get("http://www.baidu.com")
    7. driver.maximize_window()
    8. time.sleep(5)
    9. # 定位到要悬停的元素
    10. above = driver.find_element(By.LINK_TEXT, '更多')
    11. # 对定位到的元素执行悬停操作
    12. ActionChains(driver).move_to_element(above).perform() # perform 提交类中存储的行为
    13. time.sleep(5)
    14. driver.quit()

    键盘操作

    前面使用send_keys()来模拟键盘输入,还可以用它来模拟键盘上的按键,甚至是组合键,如Ctrl+a等

    1. from selenium import webdriver
    2. from selenium.webdriver import ActionChains
    3. from selenium.webdriver.common.by import By
    4. from selenium.webdriver.common.keys import Keys
    5. import time
    6. driver = webdriver.Chrome()
    7. driver.get("http://www.baidu.com")
    8. driver.maximize_window()
    9. time.sleep(5)
    10. driver.find_element(By.ID,"kw").send_keys("hello")
    11. driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, "a")
    12. time.sleep(5)
    13. driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, "x")
    14. time.sleep(5)
    15. driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, "v")
    16. time.sleep(5)
    17. driver.find_element(By.ID,"su").submit()
    18. time.sleep(5)
    19. driver.quit()

    常用验证信息获取

    • driver.title:获取当前页面的标题
    • driver.current_url:获取当前页面的url
    • driver.find_element(By.ID,’kw‘).text:获取当前元素的文本信息

    设置元素等待

    WebDriver提供了2中等待方式,显示等待和隐式等待

    显示等待

    显示等待是指WebDriver等待某一条件成立,则继续执行;否则在达到最大等待时间时抛出异常(TimeoutException)

    1. from selenium import webdriver
    2. from selenium.webdriver.common.by import By
    3. from selenium.webdriver.support.ui import WebDriverWait
    4. from selenium.webdriver.support import expected_conditions as EC
    5. import time
    6. driver = webdriver.Chrome()
    7. driver.get("http://www.baidu.com")
    8. driver.maximize_window()
    9. element = WebDriverWait(driver, 10, 0.5).until(
    10. EC.visibility_of_element_located((By.ID, "kw"))
    11. )
    12. element.send_keys("hello")
    13. driver.find_element(By.ID,"su").submit()
    14. time.sleep(5)
    15. driver.quit()

    webdriverwait一般与until和until_not方法配合使用:

    • until():直到condition返回True
    • until_not():直到condition返回false

    隐式等待

    WebDriver 提供的implicitly_wait()方法可用来实现隐式等待,用法相对来说简单的多;

    1. from selenium import webdriver
    2. from selenium.webdriver.common.by import By
    3. from selenium.webdriver.support import expected_conditions as EC
    4. from selenium.common.exceptions import NoSuchElementException
    5. import time
    6. driver = webdriver.Chrome()
    7. driver.implicitly_wait(10) # 隐式等待
    8. try:
    9. driver.get("http://www.baidu.com")
    10. driver.maximize_window()
    11. driver.find_element(By.ID, "kw2").send_keys("hello")
    12. except NoSuchElementException as e:
    13. print(e)
    14. finally:
    15. driver.quit()

    implicitly_wait()参数是秒。这个方法不是一个固定的等待,不影响脚本的执行速度;并且它会等待页面上所有元素。当脚本执行到某个元素定位时,如果元素存在,则继续执行,否则,它将会以轮询的方式不断判断元素是否存在,直到达到设置的等待时间,还没有定位到元素,就会抛出异常。

    定位一组元素

    定位一组元素的方法与定位某个元素的方法非常像,唯一的区别就是单词element 后面多了一个’s',用来表示负数,使用方法与定位一个元素一样:

    • find_elements(By.ID, "kw")

    多表单切换

    在web 应用中会遇到frame/iframe表单嵌套页面的应用,webdriver 只能在一个页面上对元素进行识别和定位,这时候需要一driver.switch_to.frame()方法来切换到frame内嵌页面上。

    1. from selenium import webdriver
    2. from selenium.webdriver.common.by import By
    3. import time
    4. driver = webdriver.Chrome()
    5. driver.get("http://mail.163.com")
    6. driver.maximize_window()
    7. time.sleep(5)
    8. login_frame = driver.find_element(By.CSS_SELECTOR, "[id^=x-URS-iframe]") # id后半部分的数字是随机的,因而采用css定位使用“^=”来匹配以xxx开头的元素。
    9. driver.switch_to.frame(login_frame)
    10. driver.find_element(By.NAME, "email").send_keys("wxjvv8")
    11. driver.find_element(By.NAME, "password").send_keys("111111@")
    12. driver.find_element(By.ID, "dologin").click()
    13. driver.switch_to.default_content() # 最后通过switch_to.default_content()方法回到最外层的页面
    14. driver.quit()

    switch_to.frame()方法默认可以对表单的id属性或name属性传参,因而可以定位元素的对象。

    多窗口切换

    页面操作过程中,有时单击某个链接会跳转到新的窗口,这时就需要跳转到新的窗口进行操作。WebDriver提供 switch_to.window()方法来实现在不同窗口间的切换。

    • current_window_handle:获得当前窗口句柄
    • window_handles:返回所有窗口的句柄到当前会话
    • switch_to.window():切换到相应的窗口
    1. from selenium import webdriver
    2. from selenium.webdriver.common.by import By
    3. import time
    4. driver = webdriver.Chrome()
    5. driver.get("http://www.baidu.com")
    6. driver.maximize_window()
    7. driver.implicitly_wait(10)
    8. # 获取当前窗口句柄
    9. cur_handle = driver.current_window_handle
    10. # 点击登录-注册,窗口跳转
    11. driver.find_element(By.LINK_TEXT, "登录").click()
    12. driver.find_element(By.LINK_TEXT, "立即注册").click()
    13. all_handles = driver.window_handles
    14. time.sleep(5)
    15. # 返回百度搜索页面
    16. for handle in all_handles:
    17. if handle != cur_handle:
    18. driver.switch_to.window(cur_handle)
    19. print("switch to", driver.title)
    20. time.sleep(5)
    21. driver.quit()

    警告框处理

    WebDriver处理JavaScript生成的alert、confirm、和prompt警告框的方法是 使用switch_to.alert()方法定位,然后使用下面的API操作:

    • text:返回警告框中的文字信息
    • accept():接受现有警告框
    • dismiss():解散现有警告框
    • send_keys():在警告框中输入文本(如果可以输入的话)
    1. from selenium import webdriver
    2. from selenium.webdriver.common.by import By
    3. import time
    4. driver = webdriver.Chrome()
    5. driver.get("http://www.baidu.com")
    6. driver.maximize_window()
    7. driver.implicitly_wait(10)
    8. # 弹出警告框
    9. driver.find_element(By.ID, "s-usersetting-top").click()
    10. driver.find_element(By.CSS_SELECTOR, "#s-user-setting-menu > div > a.setpref.first > span").click()
    11. driver.find_element(By.LINK_TEXT, "保存设置").click()
    12. # 切换到警告框
    13. alert = driver.switch_to.alert
    14. # 获取警告框文本
    15. print("alert text:",alert.text)
    16. # 接受警告框
    17. alert.accept()
    18. time.sleep(5)
    19. driver.quit()

    下拉框处理

    WebDriver提供了Select类来处理下拉框

    • Select类:用于定位Select标签
    • select_by_value():通过value值来定位下拉选项
    • select_by_visible_text():通过text值来定位下拉选项
    • select_by_index():通过下拉选项的索引来定位,第一个选择项为0,第二个为1...
    1. from time import sleep
    2. from selenium import webdriver
    3. from selenium.webdriver.support.select import Select
    4. dri = webdriver.Chrome()
    5. dri.get('https://www.baidu.com')
    6. # 打开搜索设置
    7. link = dri.find_element_by_link_text('设置').click()
    8. dri.find_element_by_link_text('搜索设置').click()
    9. sleep(2)
    10. # 搜索结果显示条数
    11. sel = dri.find_element_by_xpath("//select[@id='nr']")
    12. # value = "20"
    13. Select(sel).select_by_value('20')
    14. sleep(2)
    15. #
    16. Select(sel).select_by_visible_text("每页显示50条")
    17. sleep(2)
    18. # 根据下拉选项的索引进行选择
    19. Select(sel).select_by_index(0)
    20. sleep(2)
    21. dri.quit()

    上传文件

    WebDriver没有提供专门用于上传的方法,要实现上传,关键在于思路。

    在web页面中,一般点击上传,会打开本地windows窗口,从窗口选择文件进行上传。然而WebDriver无法控制windows控件,所以我们一般通过以下两种方式实现文件上传:

    • 普通上传:即将本地文件的路径作为一个值放在input标签中,通过form表单将这个值提交给服务器
    • 插件上传:一般指基于Flash、JavaScript或Ajax等技术实现的上传功能

    下载文件

    WebDriver 可以设置默认的下载路径,不同的浏览器设置的方式不同。

  • 相关阅读:
    免费小程序商城搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务
    B. Reverse Binary Strings
    微信小程序Jenkins持续集成打包发布流程
    "高绩效"指南
    原码,反码,补码 以及 位运算
    您应该使用的14个最佳WordPress SEO插件和工具
    学习Android的第二十五天
    springboot基于javaweb校园防疫管理系统毕业设计源码021043
    用《斗破苍穹》的视角打开C#3 标签与反射(人物创建与斗技使用)
    【九章斩题录】Leetcode:判定是否互为字符重排(C/C++)
  • 原文地址:https://blog.csdn.net/weixin_40417029/article/details/132761996