WebDriver-使用 Java 等待元素

我正在寻找类似于 waitForElementPresent的东西,以检查元素是否显示在我点击它之前。我认为这可以通过 implicitWait实现,所以我使用了以下方法:

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

然后点击

driver.findElement(By.id(prop.getProperty(vName))).click();

不幸的是,有时它会等待元素,有时则不会:

for (int second = 0;; second++) {
Thread.sleep(sleepTime);
if (second >= 10)
fail("timeout : " + vName);
try {
if (driver.findElement(By.id(prop.getProperty(vName))).isDisplayed())
break;
} catch (Exception e) {
writeToExcel("data.xls", e.toString(), parameters.currentTestRow, 46);
}
}
driver.findElement(By.id(prop.getProperty(vName))).click();

它一直在等待,但是在超时之前它必须等待10乘以5,50秒。有点过了。所以我将隐式等待设置为1秒,直到现在看起来一切正常。因为现在有些事情在超时之前等待10秒,而有些事情在1秒之后超时。

如何处理代码中出现/可见的等待元素? 任何提示都是可以理解的。

257558 次浏览

我的代码就是这么写的。

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));

或者

wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>));

确切地说。

参见:

上面的 wait 语句是显式等待的一个很好的例子。

因为显式等待是智能等待,仅限于特定的 web 元素(如上面 x-path 中提到的)。

通过使用显式等待,您基本上是告诉 WebDriver 最大值是等待 X 个单位(不管您给出的 timeoutInSecond 是什么)的时间,然后它才会放弃。

您可以使用显式等待或流畅等待

显式等待示例-

WebDriverWait wait = new WebDriverWait(WebDriverRefrence,20);
WebElement aboutMe;
aboutMe= wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("about_me")));

流畅等待示例-

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(20, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);


WebElement aboutMe= wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("about_me"));
}
});

查看此 教程了解更多细节。

我们有很多 elementToBeClickable的比赛条件。见 https://github.com/angular/protractor/issues/2313。沿着这条路线的某些东西运作得相当不错,即使有一点蛮力

Awaitility.await()
.atMost(timeout)
.ignoreException(NoSuchElementException.class)
.ignoreExceptionsMatching(
Matchers.allOf(
Matchers.instanceOf(WebDriverException.class),
Matchers.hasProperty(
"message",
Matchers.containsString("is not clickable at point")
)
)
).until(
() -> {
this.driver.findElement(locator).click();
return true;
},
Matchers.is(true)
);