在我的代码中,我使用了显式的Waits:
private WebDriverWait wait;
wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));我尝试了这些方法:
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("<>")));但是,在不同的代码行中,这类异常常常失败:
这个问题我找不到稳定的解决办法。
你能帮我一下吗?
发布于 2017-03-22 11:38:18
尝试通过编写处理错误的方法来处理这些小错误,比如这样的方法(比这个更好,但作为一个例子):
public static void Until_Clickable(this WebDriverWait w, By what)
{
try
{
w.Until(ExpectedConditions.ElementToBeClickable(what));
}
catch (StaleElementReferenceException)
{
w.Until(ExpectedConditions.ElementToBeClickable(what));
}
}那么,如果该特定元素有可能出现过时的引用错误:
private WebDriverWait wait;
wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until_Clickable(By.ClassName("ClassName"));但是,您需要找到抛出错误的确切行/操作。是在等待条件吗?是点击吗?是GetAttribute吗?并为这些方法编写扩展。
发布于 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元素引用之前维护它们的时间。不同的应用程序与他们的技术选择将证明不同的货架寿命你的元素。
https://sqa.stackexchange.com/questions/26299
复制相似问题