查看: 157|回复: 3

Python Selenium坐标双击ActionChains封装

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在Selenium自动化脚本里,有时需要不依赖元素定位,而是按传入的坐标触发鼠标双击。原文给出的思路是用ActionChains构造动作链:先调用move_by_offset(x, y),再调用double_click(),最后用perform()提交动作。基础函数如下:
  1. from selenium.webdriver import ActionChains
  2. def double_tap_point(driver, x, y):
  3.     actions = ActionChains(driver)
  4.     actions.move_by_offset(x, y).double_click().perform()
复制代码

driver是webdriver对象,x和y是要双击的位置坐标。调用链中move_by_offset负责把鼠标移动到传入的x、y位置,double_click()负责双击,perform()负责执行整个动作链。这个版本代码最短,适合快速验证坐标双击。

原文进一步给出优化封装版,增加了元组参数和release():
  1. from selenium.webdriver import ActionChains
  2. #from selenium.webdriver.common.action_chains import PointerInput, ActionBuilder
  3. #from selenium.webdriver.common.touch_actions import TouchActions
  4. #from selenium.webdriver.common.touch_actions import TouchActions as ta
  5. def double_tap_point(driver, x=None, y=None, duration=200):
  6.     if isinstance(x, tuple):
  7.         x, y = x
  8.     actions = ActionChains(driver)
  9.     actions.move_by_offset(x, y).double_click().release()
  10.     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调用示例:
  1. from selenium import webdriver
  2. from selenium.webdriver import ActionChains
  3. driver = webdriver.Chrome()
  4. url = "https://www.example.com"
  5. driver.get(url)
  6. def double_tap_point(driver, x=None, y=None, duration=200):
  7.     if isinstance(x, tuple):
  8.         x, y = x
  9.     actions = ActionChains(driver)
  10.     actions.move_by_offset(x, y).double_click().release()
  11.     actions.perform()
  12. x = 100
  13. y = 200
  14. 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和坐标即可。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python Selenium坐标双击ActionChains封装

感谢分享,这个封装思路挺清晰的,基础版和元组参数版覆盖了大部分快速验证和正式脚本的场景。我补充几个实际踩过的点,供参考: 第一,`move_by_offset` 是相对当前鼠标位置的偏移量,不是绝对坐标,所以连续调用或者前面有其他动作时,落点很容易偏。稳妥一点的做法是在动作链开头先 `move_by_offset(0, 0)` 归位,或者用 `ActionChains(driver).reset_actions()` 清一下状态,再执行自己的偏移。也可以考虑先 `move_to_element_with_offset` 定位到某个基准元素再偏移,这样相对稳定。 第二,`double_click()` 内部已经包含按下和释放,后面再跟 `release()` 在部分版本里是冗余的,极端情况下还可能因为没有按下就释放而报错或者行为异常。如果只是为了保险,建议单独测一下加不加 `release()` 的表现,别默认它一定有作用。 第三,`duration` 参数现在确实没用到,留着容易让调用者以为能控制双击间隔。要么删掉,要么给个注释说明预留,避免误解。 第四,元组解包那里,如果调用方传了 `double_tap_point(driver, (100, 200), 300)`,y 会被元组里的值静默覆盖,建议加个判断或者断言,参数错的时候能早点暴露。 第五,坐标是相对视口的,页面有滚动或
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python Selenium坐标双击ActionChains封装

感谢楼主分享,这个封装思路挺清晰的,基础版和优化版分开讲,适合直接拿去用。 有几点想补充交流一下。第一,move_by_offset 传的是相对当前鼠标指针位置的偏移量,不是页面绝对坐标。如果前面已经做过别的鼠标动作,指针位置不是默认原点,那么这里传 100、200 实际落点会偏。稳妥一点的做法是在动作链开头补一个 reset_actions 或者先 move_to_element 到某个已知元素再算偏移;如果确实要按页面坐标定位,也可以考虑 move_to_element_with_offset,配合页面左上角元素或 body 使用会更接近“指定坐标”的语义。 第二,封装版里 duration 参数留着但没用到,容易让调用方误会双击间隔受它控制。要么去掉,要么在注释里写明预留,或者真要控制节奏就在两次点击之间加 pause。 第三,double_click 后面再跟 release 我觉得可以保留,至少不会报错,但要注意不同 Selenium 版本对动作链里多余 release 的容忍度略有差别,跑不通时可以先试着去掉它,把问题范围缩小。 第四,元组解包那段写得挺实用,建议再补一个参数校验,x 传入 None 或者非 tuple 又没给 y 的时候直接抛 ValueError,比在 perform 阶段报个看不懂的错要好排查。 整体来说这个封装方向没问题,加上坐标语义的说明和参数
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python Selenium坐标双击ActionChains封装

这个封装挺实用的,基础版适合快速验证,元组版调用起来更方便,排查思路也写得清楚。 实际用的时候建议注意几点:move_by_offset 是相对当前鼠标位置的偏移,不是页面绝对坐标,如果前面已经有鼠标动作,当前位置会影响双击结果,最好在调用前明确鼠标位置或做归位处理。release 保留问题不大,但 double_click 本身已经包含按下和释放语义,别误以为需要额外按住。duration 参数目前没参与动作链,建议删掉或真正用于间隔,否则调用方容易以为它生效。另外 x、y 默认 None 最好加个参数校验,元组和显式 y 同时传入时也要明确优先级。整体作为按坐标双击的小工具够用,注意坐标语义和调用前状态就好。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-11-10 08:23 , Processed in 0.031892 second(s), 29 queries , Gzip On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部