Blog to understand automation concepts in QTP, Selenium Webdriver and Manual Testing concepts

Selenium - Waiting using implicit, explicit and fluent classes for Objects

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.
          WebDriver driver = new  InternetExplorerDriver();
         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:
 wait.until(ExpectedConditions.titleContains("qaautomationqtp.blogspot.in"));
 //We can also define to ignore specific types of exceptions using wait.ignoring (exception.class)e.g. :
  wait.ignoring(NoSuchElementException.class);


  • 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.


No comments:

Post a Comment