我正在为列表视图编写Java Selenium测试,特别是要验证的,然后从列表视图中选择一个项目。
但是,这让我很疯狂,因为测试会在一半的时间内运行正常,但是另一半他们会给出StaleElementReference或类似的错误,每次都会出现在不同的阶段。这是在相同的条件下运行它们。每次listview页面更改时我都会重新分配WebElement变量,因为我收集了这可能是问题,但它仍然会发生。然后我认为这可能与需要等待页面完全加载有关,但我不完全确定如何使用WebDriverWait等我见过其他人建议的东西。 但我知道我们现有的基页对象类已经包含了等待的内容,所以我认为这可能已经涵盖了:
public abstract class PageObject {
protected WebDriver driver;
protected WebDriverWait wait;
...
public PageObject(WebDriver driver, String relativePath) {
...
this.driver = driver;
this.wait = new WebDriverWait(driver, 8);
...
这还不够,还是我需要更具体的'等待'来解决这个问题?
除此之外,任何人都可以想到可能导致此问题的任何可能的常见问题吗?
非常感谢
答案 0 :(得分:2)
fluentWait()
public WebElement fluentWait(final By locator){
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(1, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
}
);
return foo;
};
所以你实际上需要找到web元素的定位器(xpath或css选择器)并将其传递给流畅的等待。而流利的等待,反过来,返回你找到的网页元素。 从文档: Wait接口的实现,可以动态配置其超时和轮询间隔。 每个FluentWait实例定义等待条件的最大时间量,以及检查条件的频率。此外,用户可以将等待配置为在等待时忽略特定类型的异常,例如在页面上搜索元素时的NoSuchElementExceptions。 的用法:强>
String xPathElement =".....blablabla...";
WebElement neededElement =fluentWait(By.xpath(xPathElement));
neededElement.click();
//neededElement.getText().trim();
你可以获得更多信息here
导致此类问题的问题可以(根据我的经验)有两种类型: 1)第一个
您与导致页面呈现或其他“慢”操作的元素进行交互。 Selenium测试继续进行,但页面实际上没有呈现&gt;&gt; staleElement
。
2)第二个。
你与一个元素互动。然后你与另一个交互导致很多AJAX(不完整页面重新加载,第一个元素刷新)。并立即返回上一个(想要例如getText或点击)&gt;&gt; staleElement
。
所以我总是用流利的等待。从设置仲裁异常忽略的角度来看,这很舒服。 希望这对你有用。