前言

本节将介绍如何使用 Selenium 切换浏览器窗口、设置等待时间以及执行 JavaScript 代码。

知识点

  • 切换浏览器窗口

    • 获取当前窗口句柄

    • 获取所有窗口句柄

    • 切换窗口

  • 设置等待时间

    • 显式等待

    • 强制等待

    • 隐式等待

  • 执行 JavaScript 代码

    • 删除页面元素的属性
  • 实例:使用 Selenium 切换浏览器窗口

  • 实例:使用 Selenium 设置等待时间

  • 实训:使用 Selenium 执行 JavaScript 代码

切换浏览器窗口

在使用 Selenium 进行自动化测试时,有时需要在多个浏览器窗口之间进行切换,比如在一个窗口中点击某个链接,会打开一个新的窗口,这时就需要切换到新的窗口进行操作。

获取当前窗口句柄

在 Selenium 中,每个窗口都有一个唯一的句柄(handle),可以通过 current_window_handle 属性获取当前窗口的句柄。

1
2
3
driver.current_window_handle

# Example: 69F6D5E3F788B4DCCD6080C81FD265E9

获取所有窗口句柄

通过 window_handles 属性可以获取所有窗口的句柄。

1
2
3
driver.window_handles

# Example: ['69F6D5E3F788B4DCCD6080C81FD265E9']

切换窗口

通过 switch_to.window() 方法可以切换窗口,该方法接收一个窗口句柄作为参数。

1
driver.switch_to.window(handle)

设置等待时间

在使用 Selenium 进行自动化测试时,有时需要等待页面加载完成后再进行下一步操作,这时就需要设置等待时间。

显式等待

显式等待是一种在代码中明确指定等待时间的方式。当等待时间超过指定时间后,系统将引发 TimeoutException 异常。

1
2
3
4
from selenium.webdriver.support.ui import WebDriverWait

# 将等待时间设置为 10 秒
wait = WebDriverWait(driver, 10)

在使用显式等待时,需要使用 until() 方法并指定等待条件。该方法接受一个函数作为参数,只有当函数返回值为 True 时,程序才会继续执行后续代码,否则将抛出 TimeoutException 异常。

1
2
3
4
5
6
7
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 的解释(点击展开)

Lambda 是一种匿名函数,它是一种用于创建小型、临时的、一次性函数的方法。Lambda 函数可以在一行代码中定义,通常用于传递简短的功能作为参数给其他函数。

在此处的 lambda 函数转为普通函数的形式为:

1
2
def find_kw(driver):
return driver.find_element(By.ID, "kw")

在使用 wait.until() 方法时,until() 方法会调用传递给它的函数,并将 WebDriver 对象作为参数传递给该函数。

除了 until() 方法,WebDriverWait 类还提供了 until_not() 方法,该方法与 until() 方法的作用相反,只有当函数返回值为 False 时,程序才会继续执行后续代码。

1
2
3
4
5
6
7
8
# ...
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() 方法强制等待指定的时间。

1
2
3
4
import time

# 强制等待 10 秒
time.sleep(10)

隐式等待

隐式等待是一种全局性的等待方式,只需要设置一次,对所有的页面元素都有效。当查找页面元素时,如果没有立即找到,将等待指定的时间,直到找到元素为止。

1
2
# 将隐式等待时间设置为 10 秒
driver.implicitly_wait(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
2
3
element = driver.find_element(By.ID, "myId")
# 删除元素的 disabled 属性
driver.execute_script("arguments[0].removeAttribute('disabled')", element)

实际使用

在操作页面时,如果不希望点击超链接时打开新的窗口,可以使用 JavaScript 代码删除超链接的 target 属性。

1
2
3
4
element = driver.find_element(By.ID, "myId")

# 删除元素的 target 属性
driver.execute_script("arguments[0].removeAttribute('target')", element)

实例:使用 Selenium 切换浏览器窗口

在本例中,我们将使用 Selenium 切换浏览器窗口。

打开配套网页

打开 实例:使用 Selenium 切换浏览器窗口 网页。

如上图所示,该网页中有一个超链接,点击该超链接将打开一个新的窗口。

编写脚本

1. 前置操作

1
2
3
4
5
6
7
8
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. 获取当前窗口句柄

1
2
# 获取当前窗口句柄
current_handle = driver.current_window_handle

3. 点击超链接

1
2
# 点击超链接
driver.find_element(By.LINK_TEXT, "跳转链接").click()

4. 切换回原窗口

1
2
# 切换回原窗口
driver.switch_to.window(current_handle)

5. 关闭浏览器

1
2
# 关闭浏览器
driver.quit()

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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. 前置操作

1
2
3
4
5
6
7
8
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. 设置等待时间

1
2
# 将等待时间设置为 10 秒
driver.implicitly_wait(10)

3. 获取提示文本

1
2
# 获取提示文本
text = driver.find_element(By.XPATH, '//*[@id="e6-result"]').text

4. 比较提示文本

1
2
# 比较提示文本
print('比较结果:', text == "加载完毕")

5. 关闭浏览器

1
2
# 关闭浏览器
driver.quit()

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 属性,使得点击超链接时不会打开新的窗口。

请编写脚本,实现以下功能:

  1. 打开 实例:使用 Selenium 切换浏览器窗口

  2. 删除超链接的 target 属性

  3. 点击超链接(此时不会打开新的窗口)

提示

  1. 在使用 execute_script() 方法时,可以使用 arguments 参数将选中的元素传递给 JavaScript 代码。

  2. 在 JavaScript 中,可以使用 removeAttribute() 方法删除页面元素的属性。

参考答案

点击展开
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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