Python Django:Selenium-浏览时的过时元素引用
我正在使用Chrome webdriver,因为Firefox webdriver在我的Windows PC上似乎有问题 在我去度假之前,我的Django功能测试运行得很好,但现在它们抛出了各种各样的错误 有时,当尝试在页面上查找元素时,我会得到: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。失败点似乎会随着运行的不同而变化
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秒有点太长了抱歉,我不得不离开这段时间。我已经坐下来,让它工作,我很高兴我做到了!我真的很感谢你的帮助。