While
automating with Selenium, we may require to pause the execution for specific
duration or until a specific condition is satisfied. In this article, we will
discuss on common scenario where we might like script to wait for few seconds
or minutes. Before going to discuss different methods to wait in selenium Web
driver,
Let us discuss on scenarios where we require to pause the execution.
- In case, we require to execute some other process between execution in the web browser. E.g. compressing some files to be uploaded from web.
- In case of Page load, waiting until the new pages opens.
- In case of availability or value displayed in controls, enable/disable of object in the Page or specific conditions is satisfied.
Below are the different wait method used with selenium scripts for synchronization:
- Using Thread.sleep
Thread. Sleep (10000)
will make the script pause for 10 sec. Thread.sleep is used in script in case
of execution outside of selenium code. For e.g.: Suppose in between performing
browser operation, we need to execute some exe file which takes some time for
execution to complete.
- Using Implicit Wait
Implicit wait tells Webdriver to poll
the DOM for a certain amount of time for object Identification and wait for availability
of object, if not available at the instance of step execution. Once set, the
implicit wait is set until the webdriver instance is closed.If the object is found below 50 sec , it will move to next step in the script.
driver.manage().timeouts().implicitlyWait(50,
TimeUnit.SECONDS);
- Using Fluent Wait
Another
wait which is very similar to Explicit Wait is fluentWait.
FluentWait<WebDriver> wait = new
FluentWait<WebDriver>(driver);
//define the
timeout – this is time the driver will wait for condition to be satisfied.
wait.withTimeout(10000, TimeUnit.MILLISECONDS);
// define
the poll time, here it will poll the DOM after 200 ms and will poll at
fixed interval until 10000 ms
wait.pollingEvery(200, TimeUnit.MILLISECONDS);
driver.get(url);
// we define the wait time for a specific condition to be satisfied using wait.until(ExpectedConditions.condition) as explained below where the driver will wait until the title of the Page contains “qaautomationqtp.blogspot.in”; We can also select from multiple conditions as shown in screenshot below:
// we define the wait time for a specific condition to be satisfied using wait.until(ExpectedConditions.condition) as explained below where the driver will wait until the title of the Page contains “qaautomationqtp.blogspot.in”; We can also select from multiple conditions as shown in screenshot below:
wait.until(ExpectedConditions.titleContains("qaautomationqtp.blogspot.in"));
//We can also define to ignore
specific types of exceptions using wait.ignoring (exception.class)e.g. :
- Using Explicit Wait
WebdriverWait is an
extension of fluent class but has functionality compared to fluent class for
waiting for an object including pooling time, ignore settings to name a few.
WebDriverWait wait = new WebDriverWait(driver, 50)
wait.until(ExpectedConditions.elementToBeClickable(By.Id("dra_reference")));
WebdriverWait and fluent class can be considered as example
of explicit wait as are defined explicitly for an element in the page, e.g. in wait.until(ExpectedConditions.elementToBeClickable(By.Id("dra_reference")));
It is explicitly waiting for the condition specific to object
with Id as "dra_reference" to be clickable.
Implicit wait is not defined for specific object but checks
for the existence of each element used and are implied until the driver
instance is closed.
So if an object is not getting loaded before the script fails,
give the object some time to load and let the script wait for object to get
identified. If all the objects are slow, give an implicit wait for the driver
that will wait for all the objects to be available or an explicit wait, waiting
explicit for an objects condition. Hope this make some sense.