使用Java?的Selenium WebDriver测试中waitForVisible/waitForElementPresent的等效项

dauxcl2d  于 2023-01-20  发布在  Java
关注(0)|答案(6)|浏览(127)

对于“HTML”Selenium测试(使用Selenium IDE创建或手动创建),您可以使用一些very handy commands,如**WaitForElementPresentWaitForVisible**。

<tr>
    <td>waitForElementPresent</td>
    <td>id=saveButton</td>
    <td></td>
</tr>

当用Java编写Selenium测试代码时(Webdriver / Selenium RC-我不确定这里的术语),是否有类似的内置
例如,要检查对话框(需要一段时间才能打开)是否可见...

WebElement dialog = driver.findElement(By.id("reportDialog"));
assertTrue(dialog.isDisplayed());  // often fails as it isn't visible *yet*

编写这种检查的最干净、最健壮的方法是什么?
到处添加Thread.sleep()调用将是丑陋和脆弱的,滚动自己的while循环似乎也相当笨拙。

i7uaboj4

i7uaboj41#

∮ ∮ ∮ ∮
隐式等待
隐式等待是告诉WebDriver在尝试查找一个或多个元素(如果这些元素不能立即可用)时轮询DOM一段时间。默认设置为0。设置后,隐式等待将设置为WebDriver对象示例的生命周期。

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

显式等待+ Expected Conditions
显式等待是您定义的代码,用于等待某个条件发生,然后再继续执行代码。最坏的情况是Thread.sleep(),它将条件设置为等待的确切时间段。提供了一些方便的方法,帮助您编写只等待所需时间的代码。WebDriverWait与ExpectedCondition结合使用是可以实现此目的的一种方法。

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.id("someid")));
bjg7j2ky

bjg7j2ky2#

WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

这将在抛出TimeoutException之前等待最多10秒,或者如果发现元素,将在0 - 10秒内返回该元素。默认情况下,WebDriverWait每隔500毫秒调用一次ExpectedCondition,直到它成功返回。成功返回是指ExpectedCondition类型为布尔值,返回值为true,或者所有其他ExpectedCondition类型的返回值不为null。

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

元素可单击-显示并启用。
WebDriver docs: Explicit and Implicit Waits开始

a0x5cqrl

a0x5cqrl3#

实际上,你可能并不想让测试无限期地运行,你只是想在库确定元素不存在之前等待更长的时间,在这种情况下,最优雅的解决方案是使用隐式等待,它就是为此而设计的:

driver.manage().timeouts().implicitlyWait( ... )
r1zhe5dt

r1zhe5dt4#

另一种方法是等待某个数量的最大值,比如说10秒的时间,让元素显示如下:

(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.findElement(By.id("<name>")).isDisplayed();

            }
        });
y1aodyip

y1aodyip5#

public static boolean waitForUntilVisible(WebDriver driver, Integer time, By by ) {
    WebDriverWait wait = new WebDriverWait(driver,  Duration.ofSeconds(time));

    try {
        wait.until( ExpectedConditions.presenceOfElementLocated(by) ); 
    }catch(NoSuchElementException e) {
        return false;
    }catch (TimeoutException e) {
        return false;
    }
    return true;
}
k2arahey

k2arahey6#

对于单个元素,可使用以下代码:

private boolean isElementPresent(By by) {
        try {
            driver.findElement(by);
            return true;
        } catch (NoSuchElementException e) {
            return false;
        }
    }
for (int second = 0;; second++) {
            if (second >= 60){
                fail("timeout");
            }
            try {
                if (isElementPresent(By.id("someid"))){
                    break;
                }
                }
            catch (Exception e) {

            }
            Thread.sleep(1000);
        }

相关问题