我有以下元素:
<div _ngcontent-yvb-1="" ng-reflect-class-name="d3-data-table-cell code" class="d3-data-table-cell code" ng-reflect-id="entity_data_manager_table_cell_code" id="entity_data_manager_table_cell_code">
UP
</div>
我在Selenium中使用Java进行了测试,其中我使用id="entity_data_manager_table_cell_code"
识别了元素。该测试过去曾经过5次,但是会不时地使用消息stale element
失败。现在测试始终失败并显示消息:
stale element reference: element is not attached to the page document
为什么会这样?开发商说他没有改变任何事情。会有什么解决方案?
答案 0 :(得分:0)
原因可能是您的元素在您访问它之前未完全加载。 尝试对该特定元素使用显式等待。 如果动态发生变化,请咨询开发人员,为该元素提供唯一的参考。
如果页面上发生的DOM操作暂时导致元素无法访问,则会发生陈旧元素引用。为了允许这些情况,您可以尝试在循环中多次访问该元素,然后再抛出异常。
尝试按类名
找到元素driver.findElement(By.className("date-header"));
答案 1 :(得分:0)
您可以按以下方式处理例外
public boolean retryingFindClick(By by) {
boolean result = false;
int attempts = 0;
while(attempts < 2) {
try {
driver.findElement(by).click();
result = true;
break;
} catch(StaleElementException e) {
}
attempts++;
}
return result;
}
有关详情http://darrellgrainger.blogspot.co.uk/2012/06/staleelementexception.html
,请参阅此处答案 2 :(得分:0)
我使用这个“WebElement”而不是普通的“WebElement”来修复它 这个想法来自别人我不记得了。
public class RefreshableWebElement2 implements WebElement {
private final WebDriver driver;
private final By by;
public RefreshableWebElement2(WebDriver driver, By by) {
this.driver = driver;
this.by = by;
}
private WebElement getElement() {
return driver.findElement(by);
}
@Override
public <X> X getScreenshotAs(OutputType<X> target) throws WebDriverException {
return getElement().getScreenshotAs(target);
}
@Override
public void click() {
getElement().click();
}
// ... }