KaGo
KaGo

Reputation: 123

Using selenium and python, how to check that even though an element exists but it is not actually visible

I have been using the find_element_by_xpath or cssSelector to locate elements on a page.

Today, I ran into a problem where the xpath of an alert message is present in the HTML but actually not visible on the site. An example is JS will display a banner message when the users enter a page, but disappears after 3s.

The CSS Selector span.greet will always return an element in HTML, but it doesn't necessary mean that it is displaying on the page.

...
<span class="greet">Hello</span>
<span class="greetAgain">Hello Again!</span>
...

I read the documentation on is_Visible() but I'm not quite sure if I understand fully if it could be a solution? If not, is there other methods I could use instead?

Upvotes: 1

Views: 2105

Answers (3)

ozkulah
ozkulah

Reputation: 64

I had similar problem, but in my case another element was overlaying the actual element. So I found a solution using javascript executer instead of clicking with webdriver. Waiting for an amount of time can cause random errors during the tests. Example click OK button:

ok_btn = self.driver.find_element_by_xpath("//button[contains(.,'OK')]")
self.driver.execute_script("arguments[0].click();",  ok_btn)

Upvotes: 1

alecxe
alecxe

Reputation: 474171

You need to explicitly wait for visibility_of_element_located Expected Condition. Or, in other words, wait for element to become visible:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.greet")))

Resist temptation to use time.sleep() - it is very unreliable and error-prompt.

Upvotes: 0

Kedar
Kedar

Reputation: 1698

After loading the page via selenium, the element may be visible when you test, but hidden after some time.

A simple way would be to wait for a fixed period of time.

You can use time.sleep to pause your script if you want to wait for the element to hide.

import time

def your_test_function():
    # initial tests (to check if elements are displayed)
    time.sleep(3)
    # delayed tests (to check if something is hidden)

If you need more control, or you want to wait for elements to be displayed / hidden you can use the Webdriver's Wait method.

http://selenium-python.readthedocs.org/en/latest/waits.html?highlight=wait

Also, you should use the is_displayed method to check if the element is visible.

http://selenium-python.readthedocs.org/en/latest/api.html?highlight=is_displayed#selenium.webdriver.remote.webelement.WebElement.is_displayed

Upvotes: 0

Related Questions