为什么我只能在每个测试的单个页面上执行鼠标悬停操作

时间:2016-04-20 09:42:23

标签: python selenium selenium-webdriver

我正在尝试在2个不同的页面上执行相同的测试中的move_to_element(没有拆除)并且我得到StaleElementException抛出。 该测试基本上是一个电子商务网站,我必须将鼠标悬停在某个产品上,以便可以选择将其添加到购物车中。在主页上,我必须将鼠标悬停在菜单上才能进入产品类别。

我在下面添加了一个功能(这就是我使用的功能)。它处理弹出窗口然后退出并再次尝试的情况。

 @staticmethod
def hover_over(some_element):
    try:
        action.move_to_element(wait.until(EC.visibility_of_element_located((some_element)))).perform()
    except WebDriverException:
        try:
            pop = browser.find_element(*popup_exit_class)
            pop.click()
            wait.until(EC.visibility_of_element_located((some_element)))
            action.move_to_element(wait.until(EC.visibility_of_element_located((some_element)))).perform()

我也试过没有这个功能:

 x = browser.find_element(*some_element)
    action.move_to_element(x).perform()
    sleep(0.5)
    browser.find_element(*some_other_element).click()

如果我在Ubuntu 14.04上使用Chromedriver(它也出现在Firefox上)有任何帮助

1 个答案:

答案 0 :(得分:0)

网页元素附加到网页上。如果重新加载页面,则会删除您的元素并创建一个新元素。这就是您获得StaleElementException例外的原因。此外,您需要为每个调用实例化ActionChains:

some_element = (By.ID, "...")

element = wait.until(EC.visibility_of_element_located(some_element))
ActionChains(driver).move_to_element(element).perform()

browser.find_element(*popup_exit_class).click()

element = wait.until(EC.visibility_of_element_located(some_element))
ActionChains(driver).move_to_element(element).perform()