Sparkle CodesSparkle
项目 / web测试 / Day07

深度模拟:ActionChains 鼠标键盘事件与各种滚动姿势

x
xpx
Jun 18, 2024
Editorial Insight
#Automation#Selenium

深度模拟:ActionChains 鼠标、键盘与滚轮的组合艺术

当基本的 click() 和 send_keys() 无法满足需求(如鼠标悬停显示菜单、拖拽上传、键盘组合键等)时,我们需要 ActionChains。它的本质是模拟物理输入设备的底层行为。


1. ActionChains 核心逻辑:入库 -> 提交

ActionChains 的工作方式是:先将动作存入队列,最后一次性提交(perform)执行。

  • 初始化: actions = ActionChains(driver)
  • 链式调用: actions.move_to_element(ele).click()
  • 生效: .perform()
场景:鼠标悬停在头像上,待下拉菜单出现后点击「个人中心」
PYTHON
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 1. 定位悬停目标
avatar = driver.find_element(By.ID, 'user_avatar')
# 2. 执行悬停操作
ActionChains(driver).move_to_element(avatar).perform()
# 3. 稳妥起见,显式等待菜单项可见后再点
profile_btn = WebDriverWait(driver, 5).until(
    EC.visibility_of_element_located((By.LINK_TEXT, '个人中心'))
)
profile_btn.click()

2. 键盘事件 (Keyboard Actions)

用于处理 Shift, Control, Alt 组合键,或 Selenium 原生方法无法覆盖的按键。

  • 组合键原理: key_down (按下) -> send_keys (字符) -> key_up (弹起)。
  • 常用场景: Ctrl + A (全选)、Ctrl + C / V。
PYTHON
from selenium.webdriver.common.keys import Keys
# 示例:全选并删除输入框内容
actions = ActionChains(driver)
actions.key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL)
actions.send_keys(Keys.BACK_SPACE).perform()

3. 鼠标事件 (Mouse Actions) 精要

  • 右击 (Context Click): 触发二级菜单。
  • 双击 (Double Click): 常见于文件列表操作。
  • 拖拽 (Drag and Drop): 滑块验证码或看板任务迁移。
    • actions.drag_and_drop(source, target).perform()

4. 滚轮操作:应对懒加载 (Lazy Load)

现代网页常通过滚动触发接口请求,掌握「姿势」很重要。

方式 A:Selenium 4 原生 Wheel Actions (推荐)

这是最符合物理逻辑的方式,且支持 Headless (无界面) 模式。

  1. 滚动到指定元素: actions.scroll_to_element(footer).perform()
  2. 偏移滚动: actions.scroll_by_amount(0, 500).perform() (向下滚 500 像素)

方式 B:JavaScript 注入 (最通用)

当驱动程序对物理滚轮模拟不佳时,注入 JS 是最后的保险。

PYTHON
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 一滚到底

5. 如何验证交互成功?(Evidence Chain)

模拟了动作不代表动作成功。在自动化脚本中,必须有观察点。

  1. 菜单悬停: 验证子菜单元素的 is_displayed() 是否为 True。
  2. 拖拽操作: 验证目标容器的 HTML 结构是否增加了一个子节点,或目标元素的坐标是否发生变化。
  3. 页面滚动: 验证页面 window.pageYOffset 是否大于执行前的值,或原本不可见的底栏元素现在是否已加载。

6. 工业级避坑指南

  1. 动作滞后: 连续动作过快会导致浏览器反应不及。建议在链条中适当加入 .pause(0.5)。
  2. 长按释放: 凡是用过 key_down,必须紧跟 key_up。如果不确定状态,可调用 ActionBuilder(driver).clear_actions() 强制重置。
  3. Headless 兼容性: pyautogui 等外部库不支持无界面运行。对于 CI/CD 环境,请务必坚持使用 ActionChains 或 execute_script。

继续阅读: Web自动化-文件上传与日期控件处理


结语

先通过 ActionChains 封装常用动作(如 hover),能大幅降低复杂页面的自动化脚本开发难度。

BACK TO BLOG
The End of Interaction