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

如上图所示,该网页中有一个超链接,点击该超链接将打开一个新的窗口。
编写脚本
1. 前置操作
from selenium import webdriver # 导入 webdriver
from selenium.webdriver.common.by import By # 导入 By
# 创建浏览器驱动
driver = webdriver.Chrome()
# 打开网页
driver.get("https://selenium-app.im0o.top/example6-1")
2. 获取当前窗口句柄
# 获取当前窗口句柄
current_handle = driver.current_window_handle
3. 点击超链接
# 点击超链接
driver.find_element(By.LINK_TEXT, "跳转链接").click()
4. 切换回原窗口
# 切换回原窗口
driver.switch_to.window(current_handle)
5. 关闭浏览器
# 关闭浏览器
driver.quit()
完整代码
from selenium import webdriver # 导入 webdriver
from selenium.webdriver.common.by import By # 导入 By
# 创建浏览器驱动
driver = webdriver.Chrome()
# 打开网页
driver.get("https://selenium-app.im0o.top/example6-1")
# 获取当前窗口句柄
current_handle = driver.current_window_handle
# 点击超链接
driver.find_element(By.LINK_TEXT, "跳转链接").click()
# 切换回原窗口
driver.switch_to.window(current_handle)
input("按 Enter 键退出")
# 关闭浏览器
driver.quit()
运行脚本

实例:使用 Selenium 设置等待时间
下面的实例将演示如何使用 Selenium 设置等待时间。
打开配套网页
打开 实例:使用 Selenium 设置等待时间 网页。

如上图所示,该网页中有一个计时器,在 5 秒后将显示 加载完毕。
编写脚本
1. 前置操作
from selenium import webdriver # 导入 webdriver
from selenium.webdriver.common.by import By # 导入 By
# 创建浏览器驱动
driver = webdriver.Chrome()
# 打开网页
driver.get("https://selenium-app.im0o.top/example6-3")
2. 设置等待时间
# 将等待时间设置为 10 秒
driver.implicitly_wait(10)
3. 获取提示文本
# 获取提示文本
text = driver.find_element(By.XPATH, '//*[@id="e6-result"]').text
4. 比较提示文本
# 比较提示文本
print('比较结果:', text == "加载完毕")
5. 关闭浏览器
# 关闭浏览器
driver.quit()
完整代码
from selenium import webdriver # 导入 webdriver
from selenium.webdriver.common.by import By # 导入 By
# 创建浏览器驱动
driver = webdriver.Chrome()
# 打开网页
driver.get("https://selenium-app.im0o.top/example6-3")
# 将等待时间设置为 10 秒
driver.implicitly_wait(10)
# 获取提示文本
text = driver.find_element(By.XPATH, '//*[@id="e6-result"]').text
# 比较提示文本
print('比较结果:', text == "加载完毕")
input("按 Enter 键退出")
# 关闭浏览器
driver.quit()
运行脚本

实训:使用 Selenium 执行 JavaScript 代码
在配套网页——实例:使用 Selenium 切换浏览器窗口 中,有一个超链接,点击该超链接将打开一个新的窗口。
在本实训中,需要使用 Selenium 执行 JavaScript 代码,删除超链接的 target 属性,使得点击超链接时不会打开新的窗口。
请编写脚本,实现以下功能:
-
删除超链接的
target属性 -
点击超链接(此时不会打开新的窗口)
提示
-
在使用
execute_script()方法时,可以使用arguments参数将选中的元素传递给 JavaScript 代码。 -
在 JavaScript 中,可以使用
removeAttribute()方法删除页面元素的属性。
参考答案
点击展开
from selenium import webdriver # 导入 webdriver
from selenium.webdriver.common.by import By # 导入 By
# 创建浏览器驱动
driver = webdriver.Chrome()
# 打开网页
driver.get("https://selenium-app.im0o.top/example6-1")
# 获取超链接元素
element = driver.find_element(By.LINK_TEXT, "跳转链接")
# 删除元素的 target 属性
driver.execute_script("arguments[0].removeAttribute('target')", element)
# 点击超链接
element.click()
input("按 Enter 键退出")
# 关闭浏览器
driver.quit()
At Last
头图/封面素材来源:Photo by Daniel Leone on Unsplash
评论
评论加载中…