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,以便我可以在您的實際網站上嘗試或說出錯誤是什么并描述發生的情況。
添加回答
舉報