WebDriver – 等待使用Java的元素

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

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

然后点击

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

不幸的是,有时它等待的元素,有时不。 我看了一会,发现这个解决scheme:

 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秒之后超时。

你如何覆盖代码中存在/可见的等待元素? 任何提示是可观的。

这是我在我的代码中做的。

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

要么

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

准确一点。

也可以看看:

  • org.openqa.selenium.support.ui.ExpectedConditions用于各种等待场景的类似快捷方式。
  • org.openqa.selenium.support.ui.WebDriverWait的各种构造函数。

您可以使用显式等待或stream利等待

显式等待的示例 –

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

stream利等待的例子 –

 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) ); 

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

由于显式等待是局限于特定Web元素的智能等待(如上述xpath中所述)。

通过使用显式等待,你基本上是告诉WebDriver在最大等待X单位(不pipe你已经给出了timeoutInSeconds)的时间,在它放弃之前。