当前位置: 首页 > 知识库问答 >
问题:

Java和Selenium Stale元素错误

公良征
2023-03-14

我总是遇到硒元素中的陈旧元素错误。根据我的研究,当您离开页面或元素被更改时,就会发生此错误。当我在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;

共有1个答案

钱运浩
2023-03-14

首先,您应该编写更好的定位器。您所做的是将所有元素查询到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式的方式,使得列表理解变得容易。 例子: