1 回答
TA贡献1779条经验 获得超6个赞
当你调用一个动作链时,perform()并不会清除之前的步骤。你只是真正共享了你的函数,所以真正的罪魁祸首是你的代码结构以及 python 如何使用变量。
我注意到在你的函数中,你传入了两个strings,但你的函数知道driver和hover是什么。这听起来像是您正在使用全局变量。
为了演示您的问题,我使用点击计数器为您创建了这个简单的页面:
<html>
<body>
<button id="button" onclick="document.getElementById('input').value = parseInt(document.getElementById('input').value) + 1">Click me</button>
<input id="input" value="0"></input>
</body>
</html>
这是一个平面页面,每次按下按钮时都会弹出一个数字:
然后,为了向您展示发生了什么,我创建了您的代码的类似版本:
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get(r"c:\git\test.html")
actions = ActionChains(driver)
def ClickByActions(element):
actions.move_to_element(element).click().perform()
#find the button and click it a few times...
button = driver.find_element_by_id('button')
ClickByActions(button)
ClickByActions(button)
ClickByActions(button)
这样,您预计最终点击计数值为 3。然而,它是 6。
和你的问题一样。第一次调用执行 +1,第二次调用执行 +1 +1,第三次调用执行 +1 +1 +1。
最后!解决方案 - 使用您的驱动程序在函数中创建操作链:
def ClickByActions(element): localActions = ActionChains(driver) localActions.move_to_element(element).click().perform()
我在评论中注意到你说你尝试过这个。你能尝试一下吗:
不使用
hover
而是另一个名称 -传入驱动程序而不是依赖它作为全局变量。为此,您将使用
go_to(navbar_item, menu_item, driver)
显然
hover.reset_actions()
也应该有效 - 但这对我不起作用。
如果这些不起作用,请分享您的网站 URL,以便我可以在您的实际网站上尝试或说出错误是什么并描述发生的情况。
添加回答
举报