自动化测试:webdriver 的进阶使用(6)
前言
本节将介绍如何使用 Selenium 切换浏览器窗口、设置等待时间以及执行 JavaScript 代码。
知识点
切换浏览器窗口
获取当前窗口句柄
获取所有窗口句柄
切换窗口
设置等待时间
显式等待
强制等待
隐式等待
执行 JavaScript 代码
- 删除页面元素的属性
实例:使用 Selenium 切换浏览器窗口
实例:使用 Selenium 设置等待时间
实训:使用 Selenium 执行 JavaScript 代码
切换浏览器窗口
在使用 Selenium 进行自动化测试时,有时需要在多个浏览器窗口之间进行切换,比如在一个窗口中点击某个链接,会打开一个新的窗口,这时就需要切换到新的窗口进行操作。
获取当前窗口句柄
在 Selenium 中,每个窗口都有一个唯一的句柄(handle),可以通过 current_window_handle
属性获取当前窗口的句柄。
1 | driver.current_window_handle |
获取所有窗口句柄
通过 window_handles
属性可以获取所有窗口的句柄。
1 | driver.window_handles |
切换窗口
通过 switch_to.window()
方法可以切换窗口,该方法接收一个窗口句柄作为参数。
1 | driver.switch_to.window(handle) |
设置等待时间
在使用 Selenium 进行自动化测试时,有时需要等待页面加载完成后再进行下一步操作,这时就需要设置等待时间。
显式等待
显式等待是一种在代码中明确指定等待时间的方式。当等待时间超过指定时间后,系统将引发 TimeoutException
异常。
1 | from selenium.webdriver.support.ui import WebDriverWait |
在使用显式等待时,需要使用 until()
方法并指定等待条件。该方法接受一个函数作为参数,只有当函数返回值为 True
时,程序才会继续执行后续代码,否则将抛出 TimeoutException
异常。
1 | from selenium.webdriver.support.ui import WebDriverWait |
对 Lambda 的解释(点击展开)
Lambda 是一种匿名函数,它是一种用于创建小型、临时的、一次性函数的方法。Lambda 函数可以在一行代码中定义,通常用于传递简短的功能作为参数给其他函数。
在此处的 lambda
函数转为普通函数的形式为:
1 | def find_kw(driver): |
在使用 wait.until()
方法时,until()
方法会调用传递给它的函数,并将 WebDriver 对象作为参数传递给该函数。
除了 until()
方法,WebDriverWait
类还提供了 until_not()
方法,该方法与 until()
方法的作用相反,只有当函数返回值为 False
时,程序才会继续执行后续代码。
1 | # ... |
强制等待
最简单的等待方式是强制等待,即使用 time.sleep()
方法强制等待指定的时间。
1 | import time |
隐式等待
隐式等待是一种全局性的等待方式,只需要设置一次,对所有的页面元素都有效。当查找页面元素时,如果没有立即找到,将等待指定的时间,直到找到元素为止。
1 | # 将隐式等待时间设置为 10 秒 |
执行 JavaScript 代码
在 Selenium 中,可以使用 execute_script()
方法执行 JavaScript 代码。
1 | driver.execute_script("alert('Hello World!');") |
运行上述代码后,将弹出一个对话框,显示 Hello World!
。
删除页面元素的属性
在 JavaScript 中,可以使用 removeAttribute()
方法删除页面元素的属性。
1 | document.getElementById("myId").removeAttribute("disabled"); |
这段 JavaScript 代码将删除 id 为 myId
的元素的 disabled
属性。
在 Selenium 中提供了 arguments 参数,可以将选中的元素传递给 JavaScript 代码。
1 | element = driver.find_element(By.ID, "myId") |
实际使用
在操作页面时,如果不希望点击超链接时打开新的窗口,可以使用 JavaScript 代码删除超链接的 target
属性。
1 | element = driver.find_element(By.ID, "myId") |
实例:使用 Selenium 切换浏览器窗口
在本例中,我们将使用 Selenium 切换浏览器窗口。
打开配套网页
打开 实例:使用 Selenium 切换浏览器窗口 网页。
如上图所示,该网页中有一个超链接,点击该超链接将打开一个新的窗口。
编写脚本
1. 前置操作
1 | from selenium import webdriver # 导入 webdriver |
2. 获取当前窗口句柄
1 | # 获取当前窗口句柄 |
3. 点击超链接
1 | # 点击超链接 |
4. 切换回原窗口
1 | # 切换回原窗口 |
5. 关闭浏览器
1 | # 关闭浏览器 |
完整代码
1 | from selenium import webdriver # 导入 webdriver |
运行脚本
实例:使用 Selenium 设置等待时间
下面的实例将演示如何使用 Selenium 设置等待时间。
打开配套网页
打开 实例:使用 Selenium 设置等待时间 网页。
如上图所示,该网页中有一个计时器,在 5 秒后将显示 加载完毕
。
编写脚本
1. 前置操作
1 | from selenium import webdriver # 导入 webdriver |
2. 设置等待时间
1 | # 将等待时间设置为 10 秒 |
3. 获取提示文本
1 | # 获取提示文本 |
4. 比较提示文本
1 | # 比较提示文本 |
5. 关闭浏览器
1 | # 关闭浏览器 |
完整代码
1 | from selenium import webdriver # 导入 webdriver |
运行脚本
实训:使用 Selenium 执行 JavaScript 代码
在配套网页——实例:使用 Selenium 切换浏览器窗口 中,有一个超链接,点击该超链接将打开一个新的窗口。
在本实训中,需要使用 Selenium 执行 JavaScript 代码,删除超链接的 target
属性,使得点击超链接时不会打开新的窗口。
请编写脚本,实现以下功能:
删除超链接的
target
属性点击超链接(此时不会打开新的窗口)
提示
在使用
execute_script()
方法时,可以使用arguments
参数将选中的元素传递给 JavaScript 代码。在 JavaScript 中,可以使用
removeAttribute()
方法删除页面元素的属性。
参考答案
点击展开
1 | from selenium import webdriver # 导入 webdriver |
At Last
头图/封面素材来源:Photo by Daniel Leone on Unsplash