boje
boje

Reputation: 880

Selenium waitForCondition

I am doing Selenium testing for the first time. On the homepage, I call some AJAX, and i want Selenium to wait for the element to load finish. I not sure it works, but i just type selenium and the waitForCondition are able to choose.

I not matter what I choose it always return "false". I do not now if the waitForCondition even work?

How can I test if it works? And what am I doing wrong in this codes?

 selenium.waitForCondition("//input[@name='Report'", "3000");
 selenium.waitForCondition("//*[@id='MyTable']", "3000");
 selenium.waitForCondition("css=.someClass2", "3000");

If I implement by own class - it return "true"

private boolean isElementPresent(By by) {
    try {
        driver.findElement(by);
        return true;
    } catch (NoSuchElementException e) {
        return false;
    }
}

isElementPresent(By.xpath("//*[@id='MyTable']")) - return "true"

Upvotes: 6

Views: 16191

Answers (6)

Vinay Kumar VVS
Vinay Kumar VVS

Reputation: 1

Try this once:

await().atMost(10, SECONDS).until(() -> driver.findElements(By.id("elementId")).size() >1);

Upvotes: 0

Mohsin Awan
Mohsin Awan

Reputation: 1172

C#

You can do it like this:

First of all you can set timeout value for the condition.

Then you can use the condition.

var Wait = new WebDriverWait(GlobalDriver, TimeSpan.FromMinutes(1));
Wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("xPath"))));

OR

Wait.Until(driver => driver.FindElement(By.XPath("xPath")));

Thats all.

Upvotes: 2

Sachin
Sachin

Reputation: 61

Hope this works for you

new WebDriverWait(driver, 30).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    return (Boolean) js.executeScript("return jQuery.active == 0");
}

});

This will check if the jQuery library has any active AJAX requests for 30 seconds.

Upvotes: 1

Abhishek_Mishra
Abhishek_Mishra

Reputation: 4621

You can do it like this :

selenium.waitForCondition("selenium.isElementPresent(\"//input[@name='Report']\")", "30000");

This will wait for the element to be loaded till 30 seconds.

Upvotes: 1

Amitay Dobo
Amitay Dobo

Reputation: 1388

Aaran referred you to the correct documentation for Selenium WebDriver waits.

You can see that they also write about ExpectedConditions class. This contains several helpful implementation of ExpectedCondition classes, such at the "is element present one", which is ExpectedConditions.presenceOfElementLocated .

Here is an example of using it:

WebDriver driver = new ChromeDriver();
driver.get("http://www.degraeve.com/reference/simple-ajax-example.php");

driver.findElement(By.name("word")).sendKeys("bird is the word");;
driver.findElement(By.cssSelector("input[type='button']")).click();
WebDriverWait driverWait = new WebDriverWait(driver, 10);
WebElement dynamicElement = driverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#result p")));
System.out.println(dynamicElement.getText());

If you find it too verbose, why won't you just refactor it and extract a function which will accept the element locator and the webdriver, and returns you the element?

DriverWait.until() accepting an ExpectedCondition instance is like a way of passing a predicate function, just doing it through a class, or in the documentation example an anonymous nested class, since under Java you can't send a function.

The ExpectedCondition "function" you pass also returns a value, which can be useful in case you're waiting for a condition on some element (or some other value from the WebDriver), so returning it will save you an extra call.

Upvotes: 0

Arran
Arran

Reputation: 25066

waitForCondition is for Javascript calls only, not for waiting for elements to load.

What you have in isElementPresent is fine. I would combine it with explicit waits to be a bit more accurate about when an element is actually loaded and present on the screen:

http://seleniumhq.org/docs/04_webdriver_advanced.html

Upvotes: 3

Related Questions