我正在尝试学习 PageFactory 模型。我明白当我们做 initElements
的时候,WebElements 位于。例如,我单击一个 web 元素,因此 DOM 中的其他 web 元素之一发生了变化。现在,显然我会得到一个 StaleElementReferenceException
这里。我将如何解决这个问题?
我是否应该再次找到特定的 WebElement,知道 WebElement 在 DOM 中的属性可能会发生变化?还是有另一种方法来处理这个?
最佳答案
陈旧元素引用异常
StaleElementReferenceException延长 WebDriverException并表示该元素的先前引用现在是 陈旧的并且元素引用不再出现在页面的 DOM 上。
常见原因
StaleElementReferenceException
的常见原因如下面所述:ID
的(新)元素或其他属性。 findElement()
或 findElements
再次寻找元素。 回答您的疑问
initElements()
方法,该页面的所有 WebElement 都将被初始化。例如,LoginPageNew login_page = PageFactory.initElements(driver, LoginPageNew.class);
这行代码将初始化
LoginPageNew.class
范围内定义的所有静态 WebElement。随时随地从您的自动化脚本中调用它。 click()
在 <input>
标签不会触发 HTML DOM 上的任何 WebElements 的任何更改. click()
在 <button>
标签或 <a>
标签可以调用 JavaScript 或 Ajax 这反过来可能会删除一个元素,或者可以用一个具有相同 ID
的(新)元素替换(以前的)元素或其他属性。 结论
因此,如果 WebDriver 抛出 StaleElementReferenceException,这意味着即使元素仍然存在,引用也会丢失。我们应该丢弃我们拥有的当前引用,并通过在 WebElement 附加到 DOM 时再次定位它来替换它。这意味着您必须通过
initElements()
再次重新初始化该类。该方法反过来重新初始化该页面中定义的所有 WebElement。解决方案
如果旧元素已被新元素替换,简单的策略是调用 WebDriverWait与 ExpectedConditions 不合用寻找元素。
您可以在以下位置找到相关的详细讨论:
引用
以下是本次讨论的引用资料:
关于selenium - PageFactory 中的 StaleElementReference 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44838538/