首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显式等待的StaleElementReferenceException

问显式等待的StaleElementReferenceException
EN

Stack Exchange QA用户
提问于 2017-03-22 09:29:17
回答 2查看 5.3K关注 0票数 3

在我的代码中,我使用了显式的Waits:

代码语言:javascript
复制
private WebDriverWait wait;
wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));

我尝试了这些方法:

代码语言:javascript
复制
wait.Until(ExpectedConditions.ElementExists(By.Id("<>")));
wait.Until(ExpectedConditions.ElementToBeClickable(By.Id("<>")));
wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("<>")));
wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.LinkText("<>")));
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("<>")));

但是,在不同的代码行中,这类异常常常失败:

  • OpenQA.Selenium.StaleElementReferenceException:元素引用已挂起。`元素不再附加到DOM,或者页面已被刷新。
  • OpenQA.Selenium.StaleElementReferenceException:元素不再有效。

这个问题我找不到稳定的解决办法。

你能帮我一下吗?

EN

回答 2

Stack Exchange QA用户

回答已采纳

发布于 2017-03-22 11:38:18

尝试通过编写处理错误的方法来处理这些小错误,比如这样的方法(比这个更好,但作为一个例子):

代码语言:javascript
复制
public static void Until_Clickable(this WebDriverWait w, By what)
{
    try
    {
        w.Until(ExpectedConditions.ElementToBeClickable(what));
    }
    catch (StaleElementReferenceException)
    {
        w.Until(ExpectedConditions.ElementToBeClickable(what));
    }
}

那么,如果该特定元素有可能出现过时的引用错误:

代码语言:javascript
复制
private WebDriverWait wait;

wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until_Clickable(By.ClassName("ClassName"));

但是,您需要找到抛出错误的确切行/操作。是在等待条件吗?是点击吗?是GetAttribute吗?并为这些方法编写扩展。

票数 2
EN

Stack Exchange QA用户

发布于 2017-03-22 18:25:19

StaleElementReferenceException往往意味着两个不同的事物中的一个。但是,这一切归结于这样一个事实,即在您告诉selenium创建WebElement之后,DOM正在经历一些更改。如果DOM中的目标节点消失了,则会导致StaleElementReferenceException。或者它是否是DOM中的绝对位置。

这个错误最棘手的部分是,原因似乎与你正在积极互动的应用程序的部分完全无关。单击一个对节点进行更改的按钮,链上任何数量的父节点都会导致元素引用失效。

当您告诉selenium获取web元素引用时,它使用您提供的定位器字符串,无论是css、class、id还是xpath。它为找到的元素创建了一种绝对路径,所以即使DOM突变不一定会破坏css选择器,比如,如果您再次使用它,它仍然可以正常工作,在这个框架下创建的绝对引用selenium不再准确。所以参考资料已经过时了。

考虑到这一点。如果不详细说明您的代码解决方案,以及您想要自动化的环境,就很难找出您可能会出现此异常的确切原因。

试着在这之前花点时间想想你在做什么。想想创建每个web元素引用的时间,以及DOM中的突变在他们的生命中发生了什么。还请考虑在允许垃圾收集这些web元素引用之前维护它们的时间。不同的应用程序与他们的技术选择将证明不同的货架寿命你的元素。

票数 1
EN
页面原文内容由Stack Exchange QA提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://sqa.stackexchange.com/questions/26299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档