文中部分代码内容不一定能够直接运行,仅供参考。

前言

本节将介绍如何使用 Selenium 模拟用户输入。

知识点

  • 模拟用户鼠标操作

  • 模拟用户键盘操作

  • 实例:使用 Selenium 进行鼠标操作

  • 实例:使用 Selenium 进行输入框操作

  • 实训:使用 Selenium 模拟用户登录

Selenium Action 接口

Action 接口是用于向 Web 浏览器提供虚拟化设备输入操作的低级接口.

Action 接口提供了构建复杂用户输入的能力。这些操作的组合可以用于执行更复杂的用户行为。

通过 Selenium Action 接口,可以模拟以下操作:

  • 鼠标操作

  • 键盘操作

  • 笔操作(仅 Chrome)

  • 滚轮操作(仅 Chrome)

ActionChains 类

ActionChains 类是 Selenium 中用于执行复杂用户交互行为的工具。它提供了一组方法,允许你构建和执行多步骤的动作序列,包括鼠标和键盘的操作。主要的作用包括:

  1. 模拟用户操作: ActionChains 允许你模拟用户在浏览器中的各种操作,如鼠标移动、点击、双击、拖拽等,以及键盘的按键操作。

  2. 处理复杂的用户交互场景: 在某些情况下,简单的单一鼠标或键盘事件无法满足需求,需要进行一系列的动作来完成复杂的用户交互,例如鼠标悬停、下拉框选择、右键菜单等。

  3. 支持链式调用: ActionChains 的方法可以进行链式调用,使得可以方便地构建复杂的动作序列。这种链式调用的语法风格使得代码更加清晰和易于维护。

以下是一个简单的例子,演示了如何使用 ActionChains 执行鼠标移动和点击操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By

# 创建浏览器驱动
driver = webdriver.Chrome()

# 打开网页
driver.get("https://example.com")

# 定位目标元素
target_element = driver.find_element(By.XPATH, "//button[@id='my_button']")

# 创建 ActionChains 对象
actions = ActionChains(driver)

# 将鼠标移动到目标元素上
actions.move_to_element(target_element)

# 在目标元素上执行鼠标左键点击操作
actions.click()

# 执行操作
actions.perform()

在这个例子中,ActionChainsmove_to_element 方法将鼠标移动到目标元素上,然后 click 方法执行鼠标左键点击操作。最后,通过 perform 方法执行整个动作序列。

通过 ActionChains,你可以实现更复杂的用户交互,例如拖拽、键盘组合操作等,使得你的自动化测试或爬虫脚本更加灵活和强大。

模拟用户鼠标操作

单击操作

1
2
3
4
5
# 定位到要单击的元素
element = driver.find_element(By.XPATH, '//button[@id="myButton"]')

# 执行单击操作
actions.click(element).perform()

不使用 ActionChains 类,也可以直接使用 click 方法来单击元素:

1
2
3
4
5
# 定位到要单击的元素
element = driver.find_element(By.XPATH, '//button[@id="myButton"]')

# 执行单击操作
element.click()

双击操作

1
2
3
4
5
# 定位到要双击的元素
element = driver.find_element(By.XPATH, '//div[@id="myDiv"]')

# 执行双击操作
actions.double_click(element).perform()

右击操作

1
2
3
4
5
# 定位到要右击的元素
element = driver.find_element(By.XPATH, '//span[@class="context-menu-item"]')

# 执行右击操作
actions.context_click(element).perform()

拖放操作

1
2
3
4
5
6
# 定位源元素和目标元素
source_element = driver.find_element(By.XPATH, '//div[@id="source"]')
target_element = driver.find_element(By.XPATH, '//div[@id="target"]')

# 执行拖放操作
actions.drag_and_drop(source_element, target_element).perform()

悬停操作

1
2
3
4
5
# 定位到要悬停的元素
element = driver.find_element(By.XPATH, '//a[@id="hoverLink"]')

# 执行悬停操作
actions.move_to_element(element).perform()

以上是一些常见的鼠标操作示例,更多鼠标操作示例可以参考 Selenium 官方文档

模拟用户键盘操作

Selenium 也提供了模拟用户键盘操作的功能,这对于需要在浏览器中输入文本、按下键盘快捷键或执行其他键盘相关操作的场景非常有用。

输入文本

要在输入框中输入文本,可以使用 send_keys 方法。例如:

1
2
3
4
5
# 定位输入框
input_box = driver.find_element(By.XPATH, "//input[@id='username']")

# 输入文本
input_box.send_keys("your_username")

在上面的例子中,send_keys 方法用于向输入框中输入文本。你需要替换 "your_username" 为实际的用户名。

模拟特殊键

有时,你可能需要模拟按下特殊键,例如回车键、Tab 键等。这可以通过 Keys 类来实现。例如,模拟按下回车键:

1
2
3
4
from selenium.webdriver.common.keys import Keys

# 模拟按下回车键
input_box.send_keys(Keys.ENTER)

复合键操作

Selenium 允许执行复合键操作,例如同时按下 Ctrl 键和 C 键。以下是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By

# 创建浏览器驱动
driver = webdriver.Chrome()

# 打开网页
driver.get("https://example.com")

# 定位输入框
input_box = driver.find_element(By.XPATH, "//input[@id='myInput']")

# 创建 ActionChains 对象
actions = ActionChains(driver)

# 在输入框中输入文本
actions.send_keys_to_element(input_box, "your_text")

# 同时按下Ctrl键和A键(全选文本)
actions.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL)

# 执行操作
actions.perform()

上述例子中,key_down 方法表示按下某个键,key_up 方法表示释放某个键。在这个例子中,按下 Ctrl 键,然后按下 A 键,最后释放 Ctrl 键,实现了全选文本的效果。

实例:使用 Selenium 进行鼠标操作

下面通过一个实例来演示如何使用 Selenium 进行鼠标操作。

打开配套网页

打开 实例:使用 Selenium 进行鼠标操作

如上图所示,网页提供了 5 个区域,分别对应 悬停单击双击右击拖放 操作。

悬停操作

将鼠标移动到 悬停 区域上,该区域的背景色会变为红色。

单击操作

单击 单击 区域,该区域的文本会变为 Clicked!,持续 5 秒。

双击操作

双击 双击 区域,该区域的文本会变为 Double Clicked!,持续 5 秒。

右击操作

右击 右击 区域,该区域的文本会变为 Right Clicked!,持续 5 秒。

拖放操作

拖放 区域可以任意拖动。

编写脚本

下面我们来编写脚本,实现上述操作。

1. 导入模块,创建浏览器驱动

1
2
3
4
5
6
from selenium import webdriver  # 导入 webdriver
from selenium.webdriver.common.action_chains import ActionChains # 导入 ActionChains 类
from selenium.webdriver.common.by import By # 导入 By 类

# 创建浏览器驱动
driver = webdriver.Chrome()

2. 打开网页

1
driver.get("https://selenium-app.im0o.top/example5-2")

3. 定位元素

1
2
3
4
5
6
7
8
9
10
# 定位悬停区域
hover_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-hover"]')
# 定位单击区域
click_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-click"]')
# 定位双击区域
double_click_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-doubleclick"]')
# 定位右击区域
right_click_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-rightclick"]')
# 定位拖放区域
drag_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-drag"]')

4. 创建 ActionChains 对象

1
actions = ActionChains(driver)

5. 执行操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 将鼠标移动到悬停区域上
actions.move_to_element(hover_area).perform()

# 在单击区域上执行鼠标左键单击操作
actions.click(click_area).perform()

# 在双击区域上执行鼠标左键双击操作
actions.double_click(double_click_area).perform()

# 在右击区域上执行鼠标右键单击操作
actions.context_click(right_click_area).perform()

# 在拖放区域上执行鼠标左键按下,然后拖动,最后释放鼠标操作
actions.click_and_hold(drag_area).move_by_offset(100, 100).release().perform()

6. 关闭浏览器

1
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from selenium import webdriver  # 导入 webdriver
from selenium.webdriver.common.action_chains import ActionChains # 导入 ActionChains 类
from selenium.webdriver.common.by import By # 导入 By 类
import time # 导入 time 模块

# 创建浏览器驱动
driver = webdriver.Chrome()

# 打开网页
driver.get("https://selenium-app.im0o.top/example5-2")

# 定位区域
hover_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-hover"]')
click_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-click"]')
double_click_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-doubleclick"]')
right_click_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-rightclick"]')
drag_area = driver.find_element(By.XPATH, '//*[@id="e5_2-block-drag"]')
actions = ActionChains(driver)

# 将鼠标移动到悬停区域上
actions.move_to_element(hover_area).perform()

time.sleep(2)

# 在单击区域上执行鼠标左键单击操作
actions.click(click_area).perform()

time.sleep(2)

actions.double_click(double_click_area).perform()

time.sleep(2)

# 在右击区域上执行鼠标右键单击操作
actions.context_click(right_click_area).perform()

time.sleep(2)

# 在拖放区域上执行鼠标左键按下,然后拖动,最后释放鼠标操作
actions.click_and_hold(drag_area).move_by_offset(100, 100).release().perform()

input("按 Enter 键退出")

# 关闭浏览器
driver.quit()

运行脚本

在 PyCharm 中,点击运行按钮,运行脚本。

实例:使用 Selenium 进行输入框操作

下面通过一个实例来演示如何使用 Selenium 进行输入框操作。

打开配套网页

打开 实例:使用 Selenium 进行输入框操作

如上图所示,网页提供了一个输入框。

输入文本

在输入框内输入任意文本,上方的提示文本会从 Type something in the input box. 变成 You typed: 你输入的文本

编写脚本

1. 导入模块,创建浏览器驱动

1
2
3
4
from selenium import webdriver  # 导入 webdriver

# 创建浏览器驱动
driver = webdriver.Chrome()

2. 打开网页

1
driver.get("https://selenium-app.im0o.top/example5-1")

3. 定位元素

1
2
3
4
5
# 定位输入框
input_box = driver.find_element(By.XPATH, '//*[@id="e5-Input"]')

# 定位提示文本
tip_text = driver.find_element(By.XPATH, '//*[@id="app"]/div/p')

4. 输入文本

1
2
# 在输入框中输入文本
input_box.send_keys("你输入的文本")

5. 获取提示文本,与输入文本进行比较

1
2
3
4
5
# 获取提示文本
text = tip_text.text

# 比较提示文本和输入文本
print('比较结果: ', text == "You typed: 你输入的文本")

6. 关闭浏览器

1
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
24
25
26
27
28
from selenium import webdriver  # 导入 webdriver
from selenium.webdriver.common.by import By # 导入 By 类

# 创建浏览器驱动
driver = webdriver.Chrome()

# 打开网页
driver.get("https://selenium-app.im0o.top/example5-1")

# 定位输入框
input_box = driver.find_element(By.XPATH, '//*[@id="e5-Input"]')

# 定位提示文本
tip_text = driver.find_element(By.XPATH, '//*[@id="app"]/div/p')

# 在输入框中输入文本
input_box.send_keys("你输入的文本")

# 获取提示文本
text = tip_text.text

# 比较提示文本和输入文本
print('比较结果:', text == "You typed: 你输入的文本")

input("按 Enter 键退出")

# 关闭浏览器
driver.quit()

运行脚本

在 PyCharm 中,点击运行按钮,运行脚本。

实训:使用 Selenium 模拟用户登录

在配套网页中,提供了一个登录表单,包含用户名和密码两个输入框,以及一个登录按钮。

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

  1. 打开 实训:使用 Selenium 模拟用户登录

  2. 输入用户名和密码

  3. 点击登录按钮

  4. 获取登录结果

  5. 关闭浏览器