为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 1613 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信