Python Selenium 悬停操作在内存中连接

我正在测试一个网站,该网站有一个菜单,悬停时会出现子菜单。


我创建了一个与此菜单交互的函数:


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 1

go_to('navbar item1 id', 'submenu item1')

do_something()

# action 2

go_to('navbar item1 id', 'submenu item2')

do something()

# action 3

go_to('navbar item1 id', 'submenu item3')

do_something()

selenium 实际上重复了前面的步骤,遍历过去的菜单项,例如:


实际输出 动作 1,做某事 -> 动作 1,动作 2,做某事 -> 动作 1,动作 2,动作 3,做某事


相反,我期望的输出是:


动作 1,做某事 -> 动作 2,做某事 -> 动作 3,做某事


我尝试取消设置变量:


navbar_item、menu_item、悬停、xpath、目的地。


在函数结束时没有运气。


我还尝试在我的函数中实例化悬停


悬停= ActionChains(驱动程序);


但在最后一次尝试中,我的代码停止工作。


阿波罗的战车
浏览 1615回答 1
1回答

哆啦的时光机

当你调用一个动作链时,perform()并不会清除之前的步骤。你只是真正共享了你的函数,所以真正的罪魁祸首是你的代码结构以及 python 如何使用变量。我注意到在你的函数中,你传入了两个strings,但你的函数知道driver和hover是什么。这听起来像是您正在使用全局变量。为了演示您的问题,我使用点击计数器为您创建了这个简单的页面:<html>&nbsp; &nbsp; <body>&nbsp; &nbsp; &nbsp; &nbsp; <button id="button" onclick="document.getElementById('input').value = parseInt(document.getElementById('input').value) + 1">Click me</button>&nbsp; &nbsp; &nbsp; &nbsp; <input id="input" value="0"></input>&nbsp; &nbsp; </body></html>这是一个平面页面,每次按下按钮时都会弹出一个数字:然后,为了向您展示发生了什么,我创建了您的代码的类似版本:driver = webdriver.Chrome()driver.implicitly_wait(10)driver.get(r"c:\git\test.html")actions = ActionChains(driver)def ClickByActions(element):&nbsp; &nbsp; 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&nbsp;ClickByActions(element): &nbsp;&nbsp;&nbsp;&nbsp;localActions&nbsp;=&nbsp;ActionChains(driver) &nbsp;&nbsp;&nbsp;&nbsp;localActions.move_to_element(element).click().perform()我在评论中注意到你说你尝试过这个。你能尝试一下吗:不使用hover而是另一个名称 -传入驱动程序而不是依赖它作为全局变量。为此,您将使用go_to(navbar_item, menu_item, driver)显然hover.reset_actions()也应该有效 - 但这对我不起作用。如果这些不起作用,请分享您的网站 URL,以便我可以在您的实际网站上尝试或说出错误是什么并描述发生的情况。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python