Selenium 等待页面源包含
Selenium Wait for Page Source Contains
我只是想知道是否有一种优雅的方法可以利用 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<T>
并创建自己的条件 class。提到的接口可以访问 WebDriver(由于超级接口 com.google.common.base.Function<WebDriver,T>
)。
在方法 apply
中,您可以使用 WebDriver
和调用方法 getPageSource()
让 String
显示页面源。检查 String
您喜欢的任何内容。
您不能将所有元素作为等待的条件。切换页面时weddriver自动等待页面加载。当它完成加载 HTML 元素时,它会继续。但它不会等待 JavaScript 执行。今天很多网页使用 JavaScript 在 HTML 加载后填充网页。
你应该做的是等待你想要使用的每一个元素。
wait.until(ExpectedConditions.refreshed(ExpectedConditions.visibilityOfElementLocated(by)));
或
wait.until(ExpectedConditions.refreshed(ExpectedConditions.elementToBeClickable(element))h;
您可以等待文档的 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);
}
然后就可以得到页面源码:
driver.getPageSource();
然后验证 pageSource 是否包含您要查找的内容:
driver.getPageSource().contains("your element/tag");
希望对您有所帮助!
我只是想知道是否有一种优雅的方法可以利用 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<T>
并创建自己的条件 class。提到的接口可以访问 WebDriver(由于超级接口 com.google.common.base.Function<WebDriver,T>
)。
在方法 apply
中,您可以使用 WebDriver
和调用方法 getPageSource()
让 String
显示页面源。检查 String
您喜欢的任何内容。
您不能将所有元素作为等待的条件。切换页面时weddriver自动等待页面加载。当它完成加载 HTML 元素时,它会继续。但它不会等待 JavaScript 执行。今天很多网页使用 JavaScript 在 HTML 加载后填充网页。
你应该做的是等待你想要使用的每一个元素。
wait.until(ExpectedConditions.refreshed(ExpectedConditions.visibilityOfElementLocated(by)));
或
wait.until(ExpectedConditions.refreshed(ExpectedConditions.elementToBeClickable(element))h;
您可以等待文档的 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);
}
然后就可以得到页面源码:
driver.getPageSource();
然后验证 pageSource 是否包含您要查找的内容:
driver.getPageSource().contains("your element/tag");
希望对您有所帮助!