As per the best practices:
-
If your use case 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 use case 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 it also has a height and width that is greater than 0. So in your use case, 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 use case is to invoke
click()
on any element you need to induce WebDriverWait setting the expected_conditions aselement_to_be_clickable()
which is an expectation for checking an element is visible and enabled such that you can click it. So in your use case, 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: