ActionChains 鼠标操作笔记

发布于:2025-08-15 ⋅ 阅读:(12) ⋅ 点赞:(0)

1. 引入依赖

import pytest from selenium
import webdriver from selenium.webdriver.common.by
import By from selenium.webdriver.common.action_chains import ActionChains

2. 前置准备(pytest fixture)

@pytest.fixture(scope="module") def driver(): # 创建浏览器实例
driver = webdriver.Chrome() driver.maximize_window()
driver.get("https://www.baidu.com") # 示例页面 
driver driver.quit()

3. 单击 click

def test_single_click(driver): 
element = driver.find_element(By.ID, "kw") # 百度搜索框
ActionChains(driver).click(element).perform()

注意click() 如果不传 element,则点击当前鼠标所在位置。


4. 悬停 hover

def test_hover(driver): 
element = driver.find_element(By.XPATH, '//a[text()="更多"]')
ActionChains(driver).move_to_element(element).perform()

常用于测试下拉菜单、tooltip 提示框。


5. 双击 double_click

def test_double_click(driver):
element = driver.find_element(By.ID, "kw")
ActionChains(driver).double_click(element).perform()

双击一般用于触发选中或打开操作。


6. 右击 context_click

def test_right_click(driver):
element = driver.find_element(By.ID, "kw")
ActionChains(driver).context_click(element).perform()

右键操作可以测试自定义右键菜单。


7. 元素拖拽 drag_and_drop

def test_drag_and_drop(driver):
driver.get("https://jqueryui.com/droppable/") # 示例拖拽页面
driver.switch_to.frame(driver.find_element(By.CSS_SELECTOR, ".demo-frame"))
source = driver.find_element(By.ID, "draggable") # 拖动源
target = driver.find_element(By.ID, "droppable") # 拖动目标
ActionChains(driver).drag_and_drop(source, target).perform()

8. 拖拽到指定位置 drag_and_drop_by_offset

def test_drag_and_drop_by_offset(driver):
driver.get("https://jqueryui.com/draggable/")
driver.switch_to.frame(driver.find_element(By.CSS_SELECTOR, ".demo-frame"))
source = driver.find_element(By.ID, "draggable") # 向右 100 像素,下 50 像素
ActionChains(driver).drag_and_drop_by_offset(source, 100, 50).perform()

9. 常用注意事项

  1. .perform() 必须调用

    • 所有链式操作在 .perform() 之前不会执行。

  2. 如果页面有 iframe,先 driver.switch_to.frame() 再操作元素。

  3. 如果目标元素被遮挡,需要先滚动到可见位置(element.location_once_scrolled_into_view)。

  4. 鼠标操作可能受浏览器缩放、分辨率影响,建议统一测试环境。

  5. 有延迟的交互,配合 .pause(秒数) 使用更稳。


网站公告

今日签到

点亮在社区的每一天
去签到