我正在寻找类似于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();
它等了很久,但在超时前它必须等待5次,50秒。有点多。所以我把隐式等待设置为1秒,直到现在一切都好了。因为现在有些东西在超时之前等待10秒,但是其他一些东西在1秒之后会超时。
如何覆盖代码中等待的元素/可见元素?任何提示都很明显。
答案 0 :(得分:130)
这就是我在代码中的表现。
WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));
或
wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>));
确切地说,。
另见:
答案 1 :(得分:9)
您可以使用显式等待或流利等待
显式等待的示例 -
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"));
}
});
查看此TUTORIAL了解详情。
答案 2 :(得分:3)
我们与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)
);
答案 3 :(得分:-3)
以上wait语句是显式等待的一个很好的例子。
因为显式等待是限于特定web元素的智能等待(如上面的x-path中所述)。
通过使用显式等待,你基本上是在告诉WebDriver,它最多是在它放弃之前等待X单位(无论你给出的是timeoutInSeconds)。