我总是遇到硒元素中的陈旧元素错误。根据我的研究,当您离开页面或元素被更改时,就会发生此错误。当我在web元素列表中导航以尝试通过值来标识其中一个元素时,我总是遇到这个错误。当我尝试比较名称时,它总是在下面的if语句上失败。有人知道我的问题是什么吗?关于一个更大的问题,是否有一个很好的修复陈旧元素错误?我在网上看到的只是捕捉错误并再次循环。还有比这更好的办法吗?
int attempts = 0;
while(attempts < 2){
try{
java.util.List<WebElement> elements = driver.findElements(By.tagName("span"));
for(WebElement element: elements){
if(element.getText().equals(elementName)){
return element;
}
}
}catch (org.openqa.selenium.StaleElementReferenceException e){
e.printStackTrace();
}
attempts++;
}
return null;
首先,您应该编写更好的定位器。您所做的是将所有元素查询到webelements列表中,然后在foreach循环中再次触发每个元素的
findElement
方法,直到您从循环中中断,并在循环中触发gettext
方法。这绝对是矫枉过正。最好编写一个定位器来查询该特定元素,例如//span[text()=='value ofelementNameVariable']
,然后使用WebDriverWait类,等待元素可用于交互。
例如,您可以使用VisibilityOfElementLocated
预期条件,如:
WebElement yourSpanElement = (new WebDriverWait(driver, 60))
.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[text() == \"valueOfelementNameVariable\"]")));
WebDriverWait的until函数将轮询DOM,直到ExpectedCondition返回true或发生超时。更确切地说:
重复将此实例的输入值应用于给定函数,直到出现以下情况之一:
the function returns neither null nor false,
the function throws an unignored exception,
the timeout expires,
the current thread is interrupted
如果查看visibilityOfElementLocated的实现
/**
* An expectation for checking that an element is present on the DOM of a page
* and visible. Visibility means that the element is not only displayed but
* also has a height and width that is greater than 0.
*
* @param locator used to find the element
* @return the WebElement once it is located and visible
*/
public static ExpectedCondition<WebElement> visibilityOfElementLocated(
final By locator) {
return new ExpectedCondition<WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
try {
return elementIfVisible(findElement(locator, driver));
} catch (StaleElementReferenceException e) {
return null;
}
}
@Override
public String toString() {
return "visibility of element located by " + locator;
}
};
}
它已经忽略了元素的陈旧性(意味着如果元素陈旧并且轮询继续,它将返回null),并且同一函数将在找到元素后返回元素,或者在发生上面描述的事情时抛出异常。
问题内容: 我的 JavaScript 行: 我的 webdriver 代码行: 当我运行测试时,它将引发以下异常: 因此,我一直在寻找解决方案。铬Google代码网站中报告了一些问题。有关使用,有很多建议。但这对我来说似乎不是更好的解决方案,因为它可以使浏览器依赖代码。 问题答案: 几个小时后,我终于找到了使用不带JavascriptExecuter的操作的解决方案: 好吧,它为我工作。但是,这
本文向大家介绍块元素和行元素区别?相关面试题,主要包含被问及块元素和行元素区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 块元素:独占一行,并且有自动填满父元素,可以设置margin和pading以及高度和宽度 行元素:不会独占一行,width和height会失效,并且在垂直方向的padding和margin会失
我真的很困惑Kth最小元素和Kth元素之间到底有什么区别。 第k个元素=第k个元素是数组=数组[k-1] 但是,什么是第k个最小元素?我有一个家庭作业问题,我需要写一个算法来找到2个排序数组中的第k个最小元素。我不是来要求你做作业的,你不需要给我任何算法或代码。我只想理解它是什么意思。Kth最小元素和kth元素之间有什么不同。 我问这个问题的原因是:我在谷歌上搜索什么是第k个最小的元素,其中一个是
问题内容: 如果我有: 里面有双精度值,我应该怎么做才能将所有ArrayList元素加起来? 如? 问题答案: 两种方式: 使用索引: 使用“针对每个”样式:
在Java的LinkedList中,peek和element有什么区别? 以下是OracleJava文档页面对它们的描述,但它们没有解释区别。 公共E peek() 检索但不删除此列表的头(第一个元素)。 指定者:界面中的peek Deque public E element() 检索但不删除列表的头部(第一个元素)。指定者:接口队列中的元素 区别仅仅是一个抛出异常,而另一个在列表为空的情况下返回
鉴于我在Java中有两个数组,和,我想添加元素,以元素方式,这导致一个和数组。用循环隐式地做到这一点很容易,但我想知道是否有更优雅的解决方案,也许是番石榴集合或java utils中的构建。或者可能是一种Python式的方式,使得列表理解变得容易。 例子: