I have trouble understanding how to use an 'expected conditions' to check for the presence of an element. Given this documentation it is not clear at all how to use this. I have tried the following code
def _kernel_is_idle(self):
return EC.visibility_of_element_located((By.XPATH, '//*[@id="kernel_indicator_icon" and @title="Kernel Idle"]'))
with the idea of checking an element (callable as a method within a class). There are two things that do not make any sense:
According to the documentation (I had to look up the source code!), this method should return either True
or False
. However, it returns the following:
<selenium.webdriver.support.expected_conditions.visibility_of_element_located object at 0x110321b90>
How can this function work without a webdriver
? Usually you always have a call like
driver.do_something()
but where is the referece to the webdriver for an 'expected condition'?
The ElementToBeClickable method in ExpectedConditions class sets an expectation for checking if an element is visible and enabled so that you can click it.
An expectation for checking the title of a page. title is the expected title, which must be an exact match returns True if the title matches, false otherwise. An expectation for checking the current url. url is the expected url, which must not be an exact match returns True if the url is different, false otherwise.
#1) elementToBeClickable() – The expected condition waits for an element to be clickable i.e. it should be present/displayed/visible on the screen as well as enabled. wait.
To summarize in a more organized manner:
__call__()
magic method defined)Expected Condition is supposed to be used inside the until()
method of a WebDriverWait()
instance:
wait = WebDriverWait(driver, 10)
wait.until(<Expected_condition_here>)
the result of an Expected Condition does not have to be just True
/False
. The result would be tested on truthiness by the WebDriverWait
. Note: a WebElement
instance is "truthy". Read more about truthiness in Python here
it is quite convenient that when an Expected Condition returns a WebElement
instance. It allows to have a link to an element right away without the need to find it again:
button = wait.until(EC.element_to_be_clickable((By.ID, "my_id")))
button.click()
Seems you were almost there.
The Documentation
clearly says the following:
class selenium.webdriver.support.expected_conditions.visibility_of_element_located(locator)
Which is defined as :
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. locator - used to find the element
returns the WebElement once it is located and visible
Hence, when you mention:
return EC.visibility_of_element_located((By.XPATH, '//*[@id="kernel_indicator_icon" and @title="Kernel Idle"]'))
The found out WebElement
is being returned as follows :
<selenium.webdriver.support.expected_conditions.visibility_of_element_located object at 0x110321b90>
Even the Source Code
says the same as :
try:
return _element_if_visible(_find_element(driver, self.locator))
When the search is unsuccessfull :
except StaleElementReferenceException:
return False
The way expected conditions
work is by defining a WebDriverWait
. You create this with an instance of your WebDriver
and a timeout. The WebDriverWait
has an until()
method which will take an expected condition
and will wait until it has been met or until the timeout has passed. So instead of just EC.visibility_of_element_located((By.XPATH, '//*[@id="kernel_indicator_icon" and @title="Kernel Idle"]'))
you should use:
WebDriverWait(yourdriver, timeout).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="kernel_indicator_icon" and @title="Kernel Idle"]')))
Edit
I should note that this doesn't return True
or False
. This will return the WebElement
if it has been found and is visible. Otherwise it will raise a TimeOutException
. Source
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With