Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selenium - wait until element is present, visible and interactable

I have a Selenium script (Python) that clicks a reply button to make the class anonemail appear. The time it takes for the class anonemail to appear varies. Because of that I have to use sleep until the element has appeared.

I want to wait until the class has appeared instead of using sleep. I have heard about wait commands, but I don't know how to use them.

This is what I have thus far:

browser.find_element_by_css_selector(".reply-button").click() sleep(5) email=browser.find_element_by_css_selector(".anonemail").get_attribute("value") 
like image 904
Benjamin Arvola Avatar asked Dec 01 '19 21:12

Benjamin Arvola


People also ask

How do you use wait until element is visible in Selenium?

Selenium: Waiting Until the Element Is Visiblevar wait = new WebDriverWait(driver, TimeSpan. FromSeconds(20)); As you can see, we give the WebDriverWait object two parameters: the driver itself and a TimeSpan object that represents the timeout for trying to locate the element.

What is explicit wait in Selenium?

Explicit Wait in Selenium By using the Explicit Wait command, the WebDriver is directed to wait until a certain condition occurs before proceeding with executing the code. Setting Explicit Wait is important in cases where there are certain elements that naturally take more time to load.

How do I make Selenium wait 10 seconds?

We can make Selenium wait for 10 seconds. This can be done by using the Thread. sleep method. Here, the wait time (10 seconds) is passed as a parameter to the method.

How do you implement explicit wait?

Syntax of Explicit wait in selenium webdriver // Create object of WebDriverWait class WebDriverWait wait=new WebDriverWait(driver,20); // Wait till the element is not visible WebElement element=wait. until(ExpectedConditions. visibilityOfElementLocated(By.


1 Answers

As per the best practices:

  • If your usecase is to validate the presence of any element you need to induce WebDriverWait setting the expected_conditions as presence_of_element_located() which is the expectation for checking that an element is present on the DOM of a page. This does not necessarily mean that the element is visible. So the effective line of code will be:

    WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".reply-button"))).click() 
  • If your usecase is to extract any attribute of any element you need to induce WebDriverWait setting the expected_conditions as visibility_of_element_located(locator) which is an expectation for checking that an element is present on the DOM of a page and visible. Visibility means that the element is not only displayed but also has a height and width that is greater than 0. So in your usecase effectively the line of code will be:

    email = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "element_css"))).get_attribute("value") 
  • If your usecase is to invoke click() on any element you need to induce WebDriverWait setting the expected_conditions as element_to_be_clickable() which is an expectation for for checking an element is visible and enabled such that you can click it. So in your usecase effectively the line of code will be:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click() 

References

You can find a couple of detailed discussion in:

  • WebDriverWait not working as expected
  • Selenium: Check for the presence of element
like image 95
undetected Selenium Avatar answered Oct 01 '22 08:10

undetected Selenium