WebDriver - 使用Java等待元素

时间:2012-07-31 08:28:11

标签: java webdriver selenium-webdriver

我正在寻找类似于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秒之后会超时。

如何覆盖代码中等待的元素/可见元素?任何提示都很明显。

4 个答案:

答案 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)。