亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python Selenium 懸停操作在內存中連接

Python Selenium 懸停操作在內存中連接

阿波羅的戰車 2023-08-22 15:14:45
我正在測試一個網站,該網站有一個菜單,懸停時會出現子菜單。我創建了一個與此菜單交互的函數:def go_to(navbar_item, menu_item):    # find the navbar item    assets_main_menu = driver.find_element(By.ID, navbar_item)    #hover over the navbar item, so the submenu appears    hover.move_to_element(assets_main_menu).perform()    # find the submenu item    xpath = "//*[contains(text(), \'" + menu_item + "\')]"    destination = driver.find_element_by_xpath(xpath)    # hover over the submenu item and clicks    hover.move_to_element(destination).click().perform()問題是我多次使用這個函數,例如:# action 1go_to('navbar item1 id', 'submenu item1')do_something()# action 2go_to('navbar item1 id', 'submenu item2')do something()# action 3go_to('navbar item1 id', 'submenu item3')do_something()selenium 實際上重復了前面的步驟,遍歷過去的菜單項,例如:實際輸出 動作 1,做某事 -> 動作 1,動作 2,做某事 -> 動作 1,動作 2,動作 3,做某事相反,我期望的輸出是:動作 1,做某事 -> 動作 2,做某事 -> 動作 3,做某事我嘗試取消設置變量:navbar_item、menu_item、懸停、xpath、目的地。在函數結束時沒有運氣。我還嘗試在我的函數中實例化懸停懸停= ActionChains(驅動程序);但在最后一次嘗試中,我的代碼停止工作。
查看完整描述

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>

這是一個平面頁面,每次按下按鈕時都會彈出一個數字:

https://img1.sycdn.imooc.com//64e4611f00014b1002860121.jpg

然后,為了向您展示發生了什么,我創建了您的代碼的類似版本:


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。

https://img1.sycdn.imooc.com//64e4612c00017ef702820153.jpg

和你的問題一樣。第一次調用執行 +1,第二次調用執行 +1 +1,第三次調用執行 +1 +1 +1。

最后!解決方案 - 使用您的驅動程序在函數中創建操作鏈:

def ClickByActions(element):
    localActions = ActionChains(driver)
    localActions.move_to_element(element).click().perform()

https://img1.sycdn.imooc.com//64e4613a000137f102980169.jpg

我在評論中注意到你說你嘗試過這個。你能嘗試一下嗎:

  • 不使用hover而是另一個名稱 -

  • 傳入驅動程序而不是依賴它作為全局變量。為此,您將使用go_to(navbar_item, menu_item, driver)

  • 顯然hover.reset_actions()也應該有效 - 但這對我不起作用。

如果這些不起作用,請分享您的網站 URL,以便我可以在您的實際網站上嘗試或說出錯誤是什么并描述發生的情況。


查看完整回答
反對 回復 2023-08-22
  • 1 回答
  • 0 關注
  • 1650 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號