Python Selenium悬停动作在内存中串联

Python Selenium悬停动作在内存中串联,python,selenium,memory,hover,Python,Selenium,Memory,Hover,我正在测试一个网站,它有一个菜单和子菜单出现在悬停 我创建了一个与此菜单交互的功能: 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(

我正在测试一个网站,它有一个菜单和子菜单出现在悬停

我创建了一个与此菜单交互的功能:

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,做点什么


我尝试了取消变量设置:

导航栏项、菜单项、悬停、xpath、目标

在功能结束时没有运气

我还尝试在函数中实例化hover

悬停=动作链(驱动程序)


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

当您调用动作链时,
perform()
不会清除前面的步骤。您只是真正共享了您的函数,所以真正的罪魁祸首是代码的结构以及python如何使用变量

我注意到在您的函数中,您传入了两个
字符串
,但是您的函数知道什么是
驱动程序
悬停
。听起来像是在使用全局变量

为了演示您的问题,我使用单击计数器为您创建了此简单页面:

<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>
这样,您希望结束单击计数值为3。然而,它是6。

和你的问题一样。第一次呼叫为+1,第二次呼叫为+1+1,第三次呼叫为+1+1+1

终于!解决方案-使用驱动程序在函数中创建操作链:

def ClickByActions(元素):
localActions=ActionChains(驱动程序)
localActions.将\移动到\元素(元素)。单击()。执行()

我注意到你在评论中说你试过这个。请你试试:

  • 不使用
    悬停
    ,而是使用另一个名称-
  • 传入驱动程序,而不是依赖它作为全局变量。为此,您可以使用
    go\u to(导航栏项、菜单项、驱动程序)
  • 显然
    hover.reset_actions()
    也应该可以工作-但这对我来说不起作用

如果这些都不起作用,请共享您的网站URL,以便我可以在您的实际网站上尝试,或者说错误是什么,并描述发生了什么。

在您的更新中,您说您的代码停止工作。你能澄清并分享同样的错误吗?。。。在您的原始代码中,您正在重用您的操作链-您需要在每次使用之间清除它,这样您就处于正确的状态。。。您还可以在以下位置尝试hover.reset_操作:end@RichEdwards,谢谢你的回复。我修改了我的帖子我希望它现在看起来不那么模棱两可。。。我的意思是,只有在最后一种情况下,当我在函数中实例化hover时,代码才停止工作,否则一切都会工作,只是执行中有连接的操作要读取的错误消息:-)是驱动程序为空/未定义的错误吗这完全取决于代码的结构,但根据您提供的内容,您的def不知道驱动程序是什么。您是否尝试过hover.reset_actions()?谢谢@RichEdwards,您的解决方案成功了,我必须检查代码,我在另一个文件中实现函数并导入它们,然后在那里实例化驱动程序,因此将驱动程序放入函数参数中不起作用。现在我不得不将驱动程序作为参数添加到所有函数中,但至少这是可行的。PS.hover.rest_actions()对我也不起作用,但是我可以使用“hover”。不幸的是,我不能评价你的解决方案,因为我的排名太低了!再次感谢这真的毁了我的一天