guialmachado
guialmachado

Reputation: 536

Python & Selenium: How to wait until is text is present to continue?

I am trying to automate an extraction of stock prices in my broker website because yahoo and google finance have delays. But i need the code to wait for the 'home-broker' to be online so it can continue with scraping...

Here is my code:

expected = 'online'
while True:
    try:
       driver.find_element_by_xpath('//*[@id="spnStatusConexao"]').text == expected
    except NoSuchElementException:
        print('offline')
    else:
    print('online')

But, while testing it, it prints 'online' even when the homebroker displays 'offline' message.

I need to print 'offline' when the xpath text is equal to: offline . And to print 'online' when xpath text is equal to: online.

EDIT:

outter HTML:

<span id="spnStatusConexao" hover="DV_bgConexao" class="StatusConexao online">online</span>

XPath:

//*[@id="spnStatusConexao"]

Full XPath:

/html/body/form/div[9]/div/div/p[2]/span

Upvotes: 4

Views: 12401

Answers (1)

CEH
CEH

Reputation: 5909

expected_conditions in Python has a built in operation for this called text_to_be_present_in_element. The below code snippet will wait for the span element to contain the text online:

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


WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element((By.ID, "spnStatusConexao"), 'online'))

If this does not work, you can try invoking WebDriverWait on the presence_of_element_located and include the text in your XPath query:

WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//span[@id='spnStatusConexao' and contains(text(),'online')]")))

Upvotes: 10

Related Questions