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");

希望对您有所帮助!