Wait for page to load


In this tutorial, we will learn how to wait for a page to load before interacting with the weblements present on that page in order to avoid NoSuchElementException in Selenium.
Before going deeper into implementation of wait till page load in Selenium you need to understand the following points-

  • An element that triggers page load waits till the DOM gets loaded before returing control to the driver. For example - if we submit a form by clicking the Submit button then the next statement after the submit button click operation will be attemted by webDriver only after the page gets loaded completely. So, in most cases we don't even have to wait for the page to load.
  • We may have to introduce a wait time when dealing with elements that are ajax based or dynamic elements that load even after the page load.
  • In certain cases, we deal with elements that may be visible on page load or after some trigger action but take some time to be available for interaction. For example a dropdown with dynamic values may be available on the DOM throughout but have its values populated only after we perform some action based on which the corresponding values get dynamically populated. So, in this case if we try to select a particular value, we must wait for some time for the element to be available for interaction.

Wait for page to load implementation

Selenium Webdriver doesn't provide any inherent support for wait till page load implementation. But we can make use of Explicit Waits to achieve the desired outcome. For this, we need to identify the element on the webpage that's the last one to load or become available for intercation. Now, we need to use the explicit wait with the appropriate Expected condition like "ElementToBeClickable" for page load implementation. Thus, making sure that the driver waits till all the web elements get loaded successfully before attempting to interact with them.

WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable(lastElementToLoad));