Selenium FluentWait | Selenium WebDriver Tutorial
Selenium FluentWait is one of the Explicit waits.
Explicit waits are confined to a particular web element. Explicit Wait is code you define to wait for a certain condition to occur before proceeding further in the code.
Types of Explicit Waits:
- WebDriverWait
- FluentWait
Here we discuss about Selenium FluentWait. Click on this link for WebDriverWait.
Selenium FluentWait:
FluentWait can define the maximum amount of time to wait for a specific condition and frequency with which to check the condition before throwing an “ElementNotVisibleException” exception.
To say in effortless manner, it tries to find the web element repeatedly at regular intervals of time until the timeout or till the object gets found.
We use FluentWait commands mainly when we have web elements which sometimes visible in few seconds and some times take more time than usual. Mainly in Ajax applications. We could set the default pooling period based on our requirement. We could ignore any exception while polling an element.
Must Read: Waits in Selenium – Implicit, Explicit, FluentWait
Syntax:
Wait wait = new FluentWait(WebDriver reference) .withTimeout(timeout, SECONDS) .pollingEvery(timeout, SECONDS) .ignoring(Exception.class); WebElement foo=wait.until(new Function<WebDriver, WebElement>() { public WebElement applyy(WebDriver driver) { return driver.findElement(By.id("foo")); } });
Example:
Wait wait = new FluentWait<WebDriver>(driver) .withTimeout(45, TimeUnit.SECONDS) .pollingevery(5, TimeUnit.SECONDS) .ignoring(NoSuchElementException.class);
FluentWait uses two parameters mainly – timeout value and polling frequency. In the above syntax we took time out value as 45 seconds and polling frequency as 5 seconds. The maximum amount of time (45 seconds) to wait for a condition and the frequency (5 seconds) to check the success or failure of a specified condition. If the element is located with in this time frame it will perform the operations else it will throw an “ElementNotVisibleException”
Test script with an explanation – Selenium FluentWait:
Find the sample script (using Java) mentioned below. Execute it to see the functionality of a Selenium FluentWait.
package waits; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.support.ui.FluentWait; //FluentWait is a Class and it is a part of this package import org.testng.annotations.Test; import com.google.common.base.Function; public class FluentWaitClass { @Test public static void fluentWaitMethod(){ System.setProperty("webdriver.gecko.driver","D://Selenium Environment//Drivers//geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.get("http://softwaretestingplace.blogspot.com/2017/02/selenium-fluent-wait.html"); driver.findElement(By.xpath("//*[@id='post-body-5280210221385817166']/div[1]/button")).click(); FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver) .withTimeout(30, TimeUnit.SECONDS) .pollingEvery(5, TimeUnit.SECONDS) .ignoring(NoSuchElementException.class); WebElement element = wait.until(new Function<WebDriver, WebElement>() { public WebElement apply(WebDriver driver) { WebElement element = driver.findElement(By.xpath("//*[@id='softwareTestingMaterial']")); String getTextOnPage = element.getText(); if(getTextOnPage.equals("Software Testing Material - DEMO PAGE")){ System.out.println(getTextOnPage); return element; }else{ System.out.println("FluentWait Failed"); return null; } } }); } }
If you are not regular reader of my blog then I highly recommend you to signup for the free email newsletter using the below link.
Subscribe and get a free eBook and regular updates from SoftwareTestingMaterial.com
Hi Raj, This code gives an error when i took it into eclipse.
“The type FluentWait is not generic; it cannot be parameterized with arguments
1 quick fix available – remove type arguments”. Can u help with this please.
Hi Tanushri, I have executed the same script now and I didnt get any error. Could you pls check it out again.
If you face the error again then check this..
In eclipse, go to windows – preference – java – installed jres – instead of jre select the jdk..
I see JDK 1.8 is selected over there.
Still get the error “The type FluentWait is not generic; it cannot be parameterized with arguments”. Not yet fixed, sorry for being late as was quite held up.
Hi,
How to use fluentwait to find list of weblements, for my case I would like to use FluentWait for the below scenarios
List list = webDriver.findElements(by)