Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Selenium等待页面源包含_Java_Selenium_Selenium Webdriver - Fatal编程技术网

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
。对正在加载的网页运行javascript
return 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");