在Selenium自动化脚本里,有时需要不依赖元素定位,而是按传入的坐标触发鼠标双击。原文给出的思路是用ActionChains构造动作链:先调用move_by_offset(x, y),再调用double_click(),最后用perform()提交动作。基础函数如下:
- from selenium.webdriver import ActionChains
- def double_tap_point(driver, x, y):
- actions = ActionChains(driver)
- actions.move_by_offset(x, y).double_click().perform()
复制代码
driver是webdriver对象,x和y是要双击的位置坐标。调用链中move_by_offset负责把鼠标移动到传入的x、y位置,double_click()负责双击,perform()负责执行整个动作链。这个版本代码最短,适合快速验证坐标双击。
原文进一步给出优化封装版,增加了元组参数和release():
- from selenium.webdriver import ActionChains
- #from selenium.webdriver.common.action_chains import PointerInput, ActionBuilder
- #from selenium.webdriver.common.touch_actions import TouchActions
- #from selenium.webdriver.common.touch_actions import TouchActions as ta
- def double_tap_point(driver, x=None, y=None, duration=200):
- if isinstance(x, tuple):
- x, y = x
- actions = ActionChains(driver)
- actions.move_by_offset(x, y).double_click().release()
- actions.perform()
复制代码
这个封装版的变化是:x和y默认值为None;如果传入的x是tuple,函数会执行x,y=x解包,因此既可按double_tap_point(driver, 100, 200)调用,也可按double_tap_point(driver, (100,200))调用。动作链在double_click()后增加release(),再perform()提交。函数签名中保留duration=200,但示例动作链中没有继续使用该参数。代码里还保留了PointerInput、ActionBuilder、TouchActions等被注释的导入行,实际生效的是ActionChains。
完整Selenium调用示例:
- from selenium import webdriver
- from selenium.webdriver import ActionChains
- driver = webdriver.Chrome()
- url = "https://www.example.com"
- driver.get(url)
- def double_tap_point(driver, x=None, y=None, duration=200):
- if isinstance(x, tuple):
- x, y = x
- actions = ActionChains(driver)
- actions.move_by_offset(x, y).double_click().release()
- actions.perform()
- x = 100
- y = 200
- double_tap_point(driver, x, y)
复制代码
完整流程为:导入webdriver和ActionChains;创建webdriver对象并打开指定URL;定义double_tap_point函数;设置x=100、y=200后调用函数。实际使用时,x、y可按需要调整。原文说明这是“在指定位置进行双击操作”的Python实现,核心依赖ActionChains模拟鼠标操作,执行顺序为移动、双击、release释放、perform提交。
排查时,按代码结构先确认driver对象已创建、x和y已传入,再确认动作链最后调用了perform();如果使用元组调用,确认x是tuple类型,否则y需要显式传入。适用场景是需要在Selenium脚本中按坐标触发双击,而不是通过元素定位点击时使用该封装。原文示例使用from selenium.webdriver import ActionChains,并注释了selenium.webdriver.common.action_chains、touch_actions等导入;如果取消注释这些导入,应按实际Selenium版本确认类路径。总结:基础版代码短,封装版支持元组坐标并补充release(),调用时传入driver和坐标即可。 |