Java selenium陈旧元素

时间:2017-05-10 14:58:21

标签: java selenium selenium-webdriver

我有以下元素:

<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

为什么会这样?开发商说他没有改变任何事情。会有什么解决方案?

3 个答案:

答案 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();
 }

// ... }

相关问题