Java Selenium等待页面源包含
我只是想知道是否有一种优雅的方法可以利用Java Selenium等待页面源包含,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我只是想知道是否有一种优雅的方法可以利用ExpectedConditions或其他方法让我的代码等待页面的源代码包含给定的字符串,直到给定的超时。我知道如果我想使用一个特定元素的定位器,我可以使用类似的东西 WebDriverWait wait = new WebDriverWait(driver,10); wait.until(ExpectedConditions.visibilityOfElementLocated(By.linkText("foobar"))); 但我想在不使用特定元素的
ExpectedConditions
或其他方法让我的代码等待页面的源代码包含给定的字符串,直到给定的超时。我知道如果我想使用一个特定元素的定位器,我可以使用类似的东西
WebDriverWait wait = new WebDriverWait(driver,10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.linkText("foobar")));
但我想在不使用特定元素的定位器的情况下实现这一点,而只是使用整个页面源代码作为参考。有什么建议吗?在不依赖可见性的情况下,您可以检查DOM中是否存在元素:
WebDriverWait wait = new WebDriverWait(driver,10);
wait.until(ExpectedConditions.presenceOfElementLocated(By.tagName("html")));
如果要引用单个文本,可以实现ExpectedCondition
并创建自己的condition类。提到的接口可以访问WebDriver(由于超级接口com.google.common.base.Function
)
在方法
apply
中,您可以使用WebDriver
并调用方法getPageSource()
使String
显示页面源。检查字符串
以获取您喜欢的内容。您不能将所有元素作为等待的条件。切换页面时,请自动等待页面加载。加载完HTML元素后,它将继续。但它并不等待JavaScript执行。现在很多网页在加载HTML后使用JavaScript填充网页
您应该做的是等待您想要使用的每个元素
wait.until(ExpectedConditions.refreshed(ExpectedConditions.visibilityOfElementLocated(by)));
或
您可以等待文档的
readyState
变为complete
。对正在加载的网页运行javascriptreturn document.readyState”).equals(“complete”)
void waitForLoad(WebDriver driver) {
ExpectedCondition<Boolean> pageLoadCondition = new
ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
}
};
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(pageLoadCondition);
}
然后验证pageSource是否包含您要查找的内容:
driver.getPageSource().contains("your element/tag");
我希望这能有所帮助!你说的“整页源代码”到底是什么意思"? 您想如何设置条件?现在?@swinkler是的,只是html现在,但再一次,是一个元素,将通过找到。ByTagName@swinkler没关系,我只是不希望它是一个特定的子元素。你能把你想要的答案贴出来吗?这样我就能更好地了解你在说什么。假设我们正在等待页面源代码包含我的问题中提到的“foobar”。我相信方法名是
By.tagName
。正如我在回答中所说的那样。这只会在页面完全加载时等待HTML元素出现在页面上。以后添加的任何元素都将无法从webdriverHow使用scriptTimeout?这需要等待Ajax的东西吗?你不想等待AllaJavascripts完成。其中一些可能永远不会完成。为什么需要.refresh()
呢?它会刷新dom,在其中搜索元素
driver.getPageSource();
driver.getPageSource().contains("your element/tag");