我可以通过 Java 在 Selenium 中使用没有 ExpectedCondition 的 WebDriverWait 吗?

Can I use WebDriverWait without an ExpectedCondition in Selenium through Java?

我有一个项目正在使用 Cucumber/Selenium 进行前端测试。我被告知使用 WebDriverWait 而不是 Thread.sleep() 来完成测试。但是,在这种情况下,我不是在寻找预期的条件。我真的需要测试在页面加载时暂停。如果它在等待之前搜索 xPath,它将单击搜索中的第一项并继续测试错误的东西。

使用以下方法 和 Java + Selenium :

public boolean  isPageReady(WebDriver driver){
   boolean readyStateComplete = false;
    while (!readyStateComplete){
        JavascriptExecutor executor = (JavascriptExecutor) driver;
        readyStateComplete = executor.executeScript("return document.readyState").equals("complete");
    }
    return  readyStateComplete;
}

对于 C# + Selenium

private void WaitUntilDocumentIsReady(TimeSpan timeout){
    var javaScriptExecutor = WebDriver as IJavaScriptExecutor;
    var wait = new WebDriverWait(WebDriver, timeout);

    // Check if document is ready
    Func<IWebDriver, bool> readyCondition = webDriver => javaScriptExecutor
            .ExecuteScript("return (document.readyState == 'complete' && jQuery.active == 0)");
    wait.Until(readyCondition);
}

如果您打算在页面加载时需要暂停测试时使用 WebDriverWait without using any ExpectedConditions,您还可以使用 Java lambda表达式如下:

new WebDriverWait(driver, 20)
        .until(d -> ((JavascriptExecutor)d).executeScript("return document.readyState")
            .equals("complete"));

为什么需要暂停巡回测试?

如果您需要等待直到元素可见,请使用:new WebDriverWait(WebDriver driver, String timeToWait).until(ExpectedConditions.visibilityOf(WebElement element));

如果您需要等待元素可点击,请使用:new WebDriverWait(WebDriver driver, String timeToWait).until(ExpectedConditions.elementToBeClickable(WebElement element));

如果您需要等待元素出现在 DOM 上,请使用:webDriver.manage().timeouts().implicitlyWait(String timeToWait, TimeUnit.SECONDS);

使用 Thread.sleep() 或将测试暂停指定时间是一种不好的做法。