user2150250
user2150250

Reputation: 5187

Selenium Wait for Page Source Contains

I was just wondering if there's an elegant way to utilize ExpectedConditions or something else to have my code wait for a page's source to contain a given string until a given timeout. I know I can use something like this if I wanted to use a specific element's locator ...

WebDriverWait wait = new WebDriverWait(driver,10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.linkText("foobar")));

But I wanted to accomplish this without using a locator for a specific element, and just use the whole page source as my reference instead. Any suggestions?

Upvotes: 4

Views: 5924

Answers (3)

LittlePanda
LittlePanda

Reputation: 2507

You can wait for document's readyState to become complete. Run the javascript return document.readyState").equals("complete") against the web page that is loading.

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

And then you can get the page source:

driver.getPageSource();

And then verify that the pageSource contains what you are looking for:

driver.getPageSource().contains("your element/tag");

I hope this helps!

Upvotes: 1

swinkler
swinkler

Reputation: 1701

Without depending on visibility, you could check if an element is present in the DOM:

WebDriverWait wait = new WebDriverWait(driver,10);
wait.until(ExpectedConditions.presenceOfElementLocated(By.tagName("html")));

If you want to refer to individual text, you can implement ExpectedCondition<T> and create your own condition class. The mentioned interface has access to the WebDriver (due to super-interface com.google.common.base.Function<WebDriver,T>).

In the method apply you could use the WebDriver and call method getPageSource() to have String presenting the page source. Check the String for whatever you prefer.

Upvotes: 0

Andreas Waldahl
Andreas Waldahl

Reputation: 302

You cant have the all elements as a condition for waiting. When switching page weddriver automaticly wait for the page to load. WHen it has finished loading the HTML elements it continues. But it doesnt wait for JavaScript to execute. A lot of webpages today uses JavaScript to populate the webpage after the HTML has loaded.

What you should do is wait for every element you want to use.

wait.until(ExpectedConditions.refreshed(ExpectedConditions.visibilityOfElementLocated(by)));

or

wait.until(ExpectedConditions.refreshed(ExpectedConditions.elementToBeClickable(element))h;

Upvotes: 2

Related Questions