
自动化测试:模拟用户输入(5)
前言
本节将介绍如何使用 Selenium 模拟用户输入。
知识点
-
模拟用户鼠标操作
-
模拟用户键盘操作
-
实例:使用 Selenium 进行鼠标操作
-
实例:使用 Selenium 进行输入框操作
-
实训:使用 Selenium 模拟用户登录
Selenium Action 接口
Action 接口是用于向 Web 浏览器提供虚拟化设备输入操作的低级接口.
Action 接口提供了构建复杂用户输入的能力。这些操作的组合可以用于执行更复杂的用户行为。
通过 Selenium Action 接口,可以模拟以下操作:
-
鼠标操作
-
键盘操作
-
笔操作(仅 Chrome)
-
滚轮操作(仅 Chrome)
ActionChains 类
ActionChains 类是 Selenium 中用于执行复杂用户交互行为的工具。它提供了一组方法,允许你构建和执行多步骤的动作序列,包括鼠标和键盘的操作。主要的作用包括:
-
模拟用户操作:
ActionChains允许你模拟用户在浏览器中的各种操作,如鼠标移动、点击、双击、拖拽等,以及键盘的按键操作。 -
处理复杂的用户交互场景: 在某些情况下,简单的单一鼠标或键盘事件无法满足需求,需要进行一系列的动作来完成复杂的用户交互,例如鼠标悬停、下拉框选择、右键菜单等。
-
支持链式调用:
ActionChains的方法可以进行链式调用,使得可以方便地构建复杂的动作序列。这种链式调用的语法风格使得代码更加清晰和易于维护。
以下是一个简单的例子,演示了如何使用 ActionChains 执行鼠标移动和点击操作:
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()
在这个例子中,ActionChains 的 move_to_element 方法将鼠标移动到目标元素上,然后 click 方法执行鼠标左键点击操作。最后,通过 perform 方法执行整个动作序列。
通过 ActionChains,你可以实现更复杂的用户交互,例如拖拽、键盘组合操作等,使得你的自动化测试或爬虫脚本更加灵活和强大。
模拟用户鼠标操作
单击操作
# 定位到要单击的元素
element = driver.find_element(By.XPATH, '//button[@id="myButton"]')
# 执行单击操作
actions.click(element).perform()
不使用 ActionChains 类,也可以直接使用 click 方法来单击元素:
# 定位到要单击的元素
element = driver.find_element(By.XPATH, '//button[@id="myButton"]')
# 执行单击操作
element.click()
双击操作
# 定位到要双击的元素
element = driver.find_element(By.XPATH, '//div[@id="myDiv"]')
# 执行双击操作
actions.double_click(element).perform()
右击操作
# 定位到要右击的元素
element = driver.find_element(By.XPATH, '//span[@class="context-menu-item"]')
# 执行右击操作
actions.context_click(element).perform()
拖放操作
# 定位源元素和目标元素
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()
悬停操作
# 定位到要悬停的元素
element = driver.find_element(By.XPATH, '//a[@id="hoverLink"]')
# 执行悬停操作
actions.move_to_element(element).perform()
以上是一些常见的鼠标操作示例,更多鼠标操作示例可以参考 Selenium 官方文档。
模拟用户键盘操作
Selenium 也提供了模拟用户键盘操作的功能,这对于需要在浏览器中输入文本、按下键盘快捷键或执行其他键盘相关操作的场景非常有用。
输入文本
要在输入框中输入文本,可以使用 send_keys 方法。例如:
# 定位输入框
input_box = driver.find_element(By.XPATH, "//input[@id='username']")
# 输入文本
input_box.send_keys("your_username")
在上面的例子中,send_keys 方法用于向输入框中输入文本。你需要替换 "your_username" 为实际的用户名。
模拟特殊键
有时,你可能需要模拟按下特殊键,例如回车键、Tab 键等。这可以通过 Keys 类来实现。例如,模拟按下回车键:
from selenium.webdriver.common.keys import Keys
# 模拟按下回车键
input_box.send_keys(Keys.ENTER)
复合键操作
Selenium 允许执行复合键操作,例如同时按下 Ctrl 键和 C 键。以下是一个例子:
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 进行鼠标操作。
打开配套网页

如上图所示,网页提供了 5 个区域,分别对应 悬停、单击、双击、右击、拖放 操作。
悬停操作
将鼠标移动到 悬停 区域上,该区域的背景色会变为红色。

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

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

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

拖放操作
拖放 区域可以任意拖动。

编写脚本
下面我们来编写脚本,实现上述操作。
1. 导入模块,创建浏览器驱动
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. 打开网页
driver.get("https://selenium-app.im0o.top/example5-2")
3. 定位元素
# 定位悬停区域
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 对象
actions = ActionChains(driver)
5. 执行操作
# 将鼠标移动到悬停区域上
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. 关闭浏览器
driver.quit()
完整代码
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 进行输入框操作。
打开配套网页

如上图所示,网页提供了一个输入框。
输入文本
在输入框内输入任意文本,上方的提示文本会从 Type something in the input box. 变成 You typed: 你输入的文本。

编写脚本
1. 导入模块,创建浏览器驱动
from selenium import webdriver # 导入 webdriver
# 创建浏览器驱动
driver = webdriver.Chrome()
2. 打开网页
driver.get("https://selenium-app.im0o.top/example5-1")
3. 定位元素
# 定位输入框
input_box = driver.find_element(By.XPATH, '//*[@id="e5-Input"]')
# 定位提示文本
tip_text = driver.find_element(By.XPATH, '//*[@id="app"]/div/p')
4. 输入文本
# 在输入框中输入文本
input_box.send_keys("你输入的文本")
5. 获取提示文本,与输入文本进行比较
# 获取提示文本
text = tip_text.text
# 比较提示文本和输入文本
print('比较结果: ', text == "You typed: 你输入的文本")
6. 关闭浏览器
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/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 模拟用户登录
在配套网页中,提供了一个登录表单,包含用户名和密码两个输入框,以及一个登录按钮。

请编写脚本,实现以下功能:
-
输入用户名和密码
-
点击登录按钮
-
获取登录结果
-
关闭浏览器
评论
评论加载中…