Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:Selenium-浏览时的过时元素引用_Python_Django_Selenium_Django Testing - Fatal编程技术网

Python Django:Selenium-浏览时的过时元素引用

Python Django:Selenium-浏览时的过时元素引用,python,django,selenium,django-testing,Python,Django,Selenium,Django Testing,我正在使用Chrome webdriver,因为Firefox webdriver在我的Windows PC上似乎有问题 在我去度假之前,我的Django功能测试运行得很好,但现在它们抛出了各种各样的错误 有时,当尝试在页面上查找元素时,我会得到: selenium.common.exceptions.StaleElement引用异常:消息:stale元素引用:元素未附加到页面文档中 其他时候,验证url的尝试失败,因为Selenium似乎正在从上一页读取url。失败点似乎会随着运行的不同而变化

我正在使用Chrome webdriver,因为Firefox webdriver在我的Windows PC上似乎有问题

在我去度假之前,我的Django功能测试运行得很好,但现在它们抛出了各种各样的错误

有时,当尝试在页面上查找元素时,我会得到:

selenium.common.exceptions.StaleElement引用异常:消息:stale元素引用:元素未附加到页面文档中

其他时候,验证url的尝试失败,因为Selenium似乎正在从上一页读取url。失败点似乎会随着运行的不同而变化,换句话说,测试的某些部分可能会在成功和不成功之间交替执行。但是,问题似乎总是在使用
后出现。单击()

在观看浏览器时,Selenium似乎成功地导航到了页面,因此我认为它只是在浏览器中存在项目之前快速查找项目

隐式添加到我的setUpClass中。wait()
似乎没有什么帮助,但我可能用错了

我尝试了一个很有希望的想法(如下),但Selenium只是在它被告知等待的页面上超时

from contextlib import contextmanager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import \
    staleness_of
class MySeleniumTest(SomeFunctionalTestClass):
    # assumes self.browser is a selenium webdriver

    @contextmanager
    def wait_for_page_load(self, timeout=30):
        old_page = self.browser.find_element_by_tag_name('html')
        yield
        WebDriverWait(self.browser, timeout).until(
            staleness_of(old_page)
        )

    def test_stuff(self):
        # example use
        with self.wait_for_page_load(timeout=10):
            self.browser.find_element_by_link_text('a link')
            # nice!
还有其他人处理过吗?我应该遵循的解决这个问题的正确方法是什么

编辑: 发布的解决方案非常出色,并且真正清理了我的代码,因为我可以简单地向调用的函数添加一个.click(),正如所述

以下是帮助我自定义此功能的文档:


注意:我用“浏览器”这个词来代替驱动程序,我想这是我最初的想法。

等待页面加载必须是一个生成器吗?我想它会马上回来的!这就是为什么你的测试不可靠。有时,在调用find\u element\u by\u link\u text时,元素已经加载,有时则不然

我成功地使用了这种方法:

from selenium.webdriver.support import expected_conditions as EC

def wait_for_element(self, elm, by = 'id', timeout=10) :
    wait = WebDriverWait(self.driver, timeout)
    if by == 'id' :
        element = wait.until(EC.element_to_be_clickable((By.ID,elm)))
        return self.driver.find_element_by_id(elm)
    elif by == 'link':
        wait.until(EC.element_to_be_clickable( (By.LINK_TEXT,elm)))
        return self.driver.find_element_by_link_text(elm)
    # by tag, by css etc etc goes here.

我使用dom元素的突出id调用此方法,该元素应该在与页面交互之前显示。返回的元素可以直接与之交互。

Hmm,看来我需要熟悉预期条件语法才能使其适用于我的情况。不知何故,Selenium在单击后但在加载下一个URL之前比较URL。我试图搞乱它,但它仍然超时,所以我认为我的构造不正确。如果你用wait_for_元素替换wait_for_page_load调用,我已经发布了它应该可以工作。例如,wait_for_元素('a link','link',30)应该这样做。但是30秒有点太长了抱歉,我不得不离开这段时间。我已经坐下来,让它工作,我很高兴我做到了!我真的很感谢你的帮助。