use*_*679 10 selenium pageobjects selenium-webdriver page-factory staleelementreferenceexception
我正在尝试学习PageFactory模型.我理解这样一个事实,当我们这样做时initElements,WebElements就位于其中.比如说,我点击了一个webelement,因此DOM中的其他一个元素发生了变化.现在,显然我会在StaleElementReferenceException这里得到一个.我该如何解决这个问题?
我是否应该再次发现特定的WebElement知道DOM中的WebElement属性可能发生了变化?还是有另一种方法来处理这个问题?
Deb*_*anB 13
StaleElementReferenceException扩展了WebDriverException,并指示该元素的先前引用现在已过时且该元素引用不再出现在页面的DOM上.
StaleElementReferenceException如下:
ID或其他属性的(new)元素替换.findElement()或findElements再次查找元素.当我们执行initElements时,WebElements位于:当您调用initElements()method时,该页面的所有WebElements都将被初始化.例如,
LoginPageNew login_page = PageFactory.initElements(driver, LoginPageNew.class);
Run Code Online (Sandbox Code Playgroud)
这行代码将初始化在自动化脚本调用时随时随地定义的所有静态WebElementsLoginPageNew.class.
我点击了一个webelement,因此DOM中的其他一个元素发生了变化:这几乎是可能的.
click()上的<input>标签将不会触发任何的任何变化WebElements的HTML DOM.click()上一个<button>标签或<a>标签可调用的JavaScript或阿贾克斯这inturn可以删除一个元素,或者可以通过一个(新的)元素用相同的替换(以前的)元素ID或其他属性.因此,如果WebDriver抛出StaleElementReferenceException,这意味着即使元素仍然存在,引用也会丢失.我们应该丢弃当前的引用,并在它附加到DOM时再次找到WebElement来替换它.这意味着您必须再次通过initElements()方法重新初始化该类,该方法将重新初始化该页面中定义的所有WebElements.
如果旧元素已被新的相同元素替换,则简单的策略是调用StaleElementReferenceException或ID再次查找元素.
以下是此讨论的参考:
小智 0
Stale element exception在两种情况下抛出
该元素不再附加到DOM. 该元素已被完全删除。
发生这种情况时,您可以将代码包装起来,try catch block然后您可以根据需要多次循环和重试,直到成功为止。
public void waitForElementPresent(final By by, int timeout){
WebDriverWait wait = (WebDriverWait)new WebDriverWait(driver,timeout)
.ignoring(StaleElementReferenceException.class);
wait.until(new ExpectedCondition<Boolean>(){
@Override
public Boolean apply(WebDriver webDriver) {
WebElement element = webDriver.findElement(by);
return element != null && element.isDisplayed();
}
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4670 次 |
| 最近记录: |