【问题标题】:Can I use WebDriverWait without an ExpectedCondition in Selenium through Java?我可以通过 Java 在 Selenium 中使用没有 ExpectedCondition 的 WebDriverWait 吗?
【发布时间】:2019-02-27 17:24:42
【问题描述】:
我有一个项目正在使用 Cucumber/Selenium 进行前端测试。我被告知使用 WebDriverWait 而不是 Thread.sleep() 来完成测试。但是,在这种情况下,我不是在寻找预期的条件。我确实需要在页面加载时暂停测试。如果它在等待之前搜索 xPath,它将单击搜索中的第一项并继续测试错误的内容。
【问题讨论】:
标签:
java
selenium
lambda
pageload
webdriverwait
【解决方案1】:
为什么需要暂停游览测试?
如果您需要等待 untli 元素可见,请使用:new WebDriverWait(WebDriver driver, String timeToWait).until(ExpectedConditions.visibilityOf(WebElement element));
如果您需要等待 untli 元素可点击使用:new WebDriverWait(WebDriver driver, String timeToWait).until(ExpectedConditions.elementToBeClickable(WebElement element));
如果您需要等待 untli 元素出现在 DOM 上,请使用:webDriver.manage().timeouts().implicitlyWait(String timeToWait, TimeUnit.SECONDS);
使用 Thread.sleep() 或将测试暂停指定时间是一种不好的做法。
【解决方案2】:
如果您打算在不使用任何ExpectedConditions 的情况下使用WebDriverWait,而您需要在页面加载时暂停测试,您也可以使用Java lambda 表达式,如下所示:
new WebDriverWait(driver, 20)
.until(d -> ((JavascriptExecutor)d).executeScript("return document.readyState")
.equals("complete"));
【解决方案3】:
在 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);
}