selenium - PageFactory 中的 StaleElementReference 异常

标签 selenium selenium-webdriver pageobjects page-factory staleelementreferenceexception

我正在尝试学习 PageFactory 模型。我明白当我们做 initElements 的时候,WebElements 位于。例如,我单击一个 web 元素,因此 DOM 中的其他 web 元素之一发生了变化。现在,显然我会得到一个 StaleElementReferenceException这里。我将如何解决这个问题?

我是否应该再次找到特定的 WebElement,知道 WebElement 在 DOM 中的属性可能会发生变化?还是有另一种方法来处理这个?

最佳答案

陈旧元素引用异常

StaleElementReferenceException延长 WebDriverException并表示该元素的先前引用现在是 陈旧的并且元素引用不再出现在页面的 DOM 上。

常见原因

  • 面临StaleElementReferenceException的常见原因如下面所述:
  • 该元素已被完全删除。
  • 该元素不再附加到 DOM。
  • 元素所在的网页已刷新。
  • (前一个)元素已被 删除JavaScript Ajax 电话 并被替换为具有相同 ID 的(新)元素或其他属性。
  • 解决方案 : 如果一个(旧)元素已被新的相同元素替换,简单的策略是使用 findElement()findElements再次寻找元素。


  • 回答您的疑问
  • 当我们做一个 initElements 时,WebElements 位于:当你调用 initElements()方法,该页面的所有 WebElement 都将被初始化。例如,
    LoginPageNew login_page = PageFactory.initElements(driver, LoginPageNew.class);
    

    这行代码将初始化 LoginPageNew.class 范围内定义的所有静态 WebElement。随时随地从您的自动化脚本中调用它。
  • 我单击一个 web 元素,因此 DOM 中的其他 web 元素之一发生了变化:这很有可能。
  • 例如,一般调用 click()<input>标签不会触发 HTML DOM 上的任何 WebElements 的任何更改.
  • 在哪里调用 click()<button>标签或 <a>标签可以调用 JavaScript Ajax 这反过来可能会删除一个元素,或者可以用一个具有相同 ID 的(新)元素替换(以前的)元素或其他属性。


  • 结论

    因此,如果 WebDriver 抛出 StaleElementReferenceException,这意味着即使元素仍然存在,引用也会丢失。我们应该丢弃我们拥有的当前引用,并通过在 WebElement 附加到 DOM 时再次定位它来替换它。这意味着您必须通过 initElements() 再次重新初始化该类。该方法反过来重新初始化该页面中定义的所有 WebElement。

    解决方案

    如果旧元素已被新元素替换,简单的策略是调用 WebDriverWaitExpectedConditions 不合用寻找元素。

    您可以在以下位置找到相关的详细讨论:
  • How to add explicit wait in PageFactory in PageObjectModel?


  • 引用

    以下是本次讨论的引用资料:
  • Stale Element Reference Exception
  • Class StaleElementReferenceException
  • Selenium: How to tell if RemoteWebDriver.findElements(By) can throw StaleElementReferenceException at all?
  • 关于selenium - PageFactory 中的 StaleElementReference 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44838538/

    相关文章:

    file - 如何使用 Selenium 获取上次下载的文件

    python - WebDriverException : Message: Service chromedriver unexpectedly exited. 状态代码为:127

    javascript - Protractor 通过了我的测试,但没有执行 'it' block

    java - Selenium xPath - 通过部分文本定位元素

    java - TestNG - 为什么 testNG 报告器不打印出 else 语句?

    javascript - Selenium 网络驱动程序 : How to display values in console (Javascript)

    java - 如何使用 Selenium 获取深度 div 标签内的文本

    java - Selenium : unknown error: session deleted because of page crash

    java - 如何使用 Selenium 在下拉列表中选择值?

    javascript - 使用页面对象支持的 Protractor 测试多个浏览器