Selenium右键操作异常:ActionChains重复执行旧动作问题求助
解决Selenium ActionChains重复执行右键动作的问题
我之前开发类似自动化脚本时也踩过这个坑!你的推测完全正确——问题出在复用了同一个ActionChains实例。ActionChains的工作原理是把你添加的动作存在一个队列里,每次调用perform()时会执行队列里的所有动作。如果你的actionChains是全局定义的,每次调用context_click()都会往队列里追加一个右键动作,导致后续的perform()会重复执行之前的所有右键,这就是为什么(10,10)和(5,5)会反复切换状态的原因。
最可靠的解决方案:每次右键都创建新的ActionChains实例
不要复用全局的ActionChains对象,而是在每次需要右键点击时创建一个新的实例,这样每次队列里只有当前的右键动作,不会累积旧动作。修改后的代码如下:
from selenium import webdriver from selenium.webdriver import ActionChains def click(rad, kol, bomb = False): if int(rad) > 0 and int(kol) > 0: tile = driver.find_element_by_xpath('//*[@id="{}_{}"]'.format(int(rad), int(kol))) if bomb == False: # 左键点击直接用元素自身的click方法 tile.click() else: # 每次右键点击都新建ActionChains实例 actions = ActionChains(driver) actions.context_click(tile).perform() print("Right click")
为什么reset_actions()没起作用?
reset_actions()方法理论上是清除队列里的动作,但在某些Selenium版本或浏览器驱动(比如ChromeDriver)中,它可能无法彻底清除所有残留的动作上下文。尤其是当动作已经被发送到浏览器端后,这个方法的效果就不稳定了。所以直接创建新实例是最稳妥的做法。
额外提示
如果你一定要复用ActionChains实例,可以尝试在每次perform()后立即调用reset_actions(),同时还要确保清空浏览器端的动作:
actionChains.context_click(tile).perform() actionChains.reset_actions() # 额外清空浏览器端的动作队列 driver.execute_script("window.clearTimeout();")
不过这个方法的兼容性不如新建实例好,还是推荐第一种方案。
修改后再调用三次右键点击,每个格子只会被右键一次,状态就不会反复切换了,亲测有效!
内容的提问来源于stack exchange,提问作者Albin
相关产品推荐
相关产品推荐

