WebDriver - 等待使用 Java 的元素

2022-08-31 12:07:45

我正在寻找类似于在单击元素之前检查元素是否显示的东西。我认为这可以由 来完成,所以我使用了以下内容:waitForElementPresentimplicitWait

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

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


答案 1

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

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

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

确切地说。

另请参阅:


答案 2

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

显式等待的示例 -

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

有关更多详细信息,请查看本教程


推荐