WebDriver-使用Java等待元素


78

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

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

Answers:


153

这就是我在代码中这样做的方式。

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

要么

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

确切地说。

也可以看看:


2
谢谢!如果我只早一点知道这堂课,我的生活就会更轻松了:)
tom 2012年

如何将您的代码合并为这种格式? @FindBy(how = How.ID, using = "signup-button") WebElement signUpButton;而且,我仍然可以通过您的代码获得NPE。看起来它正在尝试获取elementToBeClickable。未加载元素时如何使用此方法?
HelloWorldNoMore

10

您可以使用“显式等待”或“流利等待”

显式等待的示例-

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

查看此教程以获取更多详细信息。


1
不建议使用此方法。
JGFMK

5

我们有很多比赛条件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)
        );

-5

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

由于“显式等待”是仅限于特定Web元素的智能等待(如以上x路径中所述)。

通过使用显式等待,您基本上是在最大程度上告诉WebDriver在放弃之前等待X个单位(无论您以timeoutInSeconds为单位)的时间。


5
在您的答案中添加一些代码段,因为其他用户可能对答案进行不同的排序,并且“ Above”的上下文可能会随之改变。
Devraj Gadhavi 2014年

已有5年了,仍在等待代码段,因此对于正在寻找有关该主题的信息的其他人来说,这可能是有意义的。
Caperneoignis

如果有人想了解更多有关此答案的信息。 guru99.com/implicit-explicit-waits-selenium.html
Murtaza Haji
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.