Как дождаться заполнения элемента текстом

#python #selenium #selenium-webdriver #web-scraping

#питон #селен #selenium-веб-драйвер #соскабливание полотна

Вопрос:

Я использую Selenium Python и работаю над страницей, данные на которой заполняются из JS и изменяются каждые 10 секунд, но это не важно, потому что я буду запускать его раз в неделю, я хочу подождать, пока td with id='e5' он получит свое значение и будет заполнен, или, скорее, пока сайт не будет полностью загружен,Адрес сайта выглядит следующим образом: Адрес сайта

Но я не нахожу подходящих ожидаемых условий для этой работы :

     driver = webdriver.Firefox()
    driver.get('http://www.tsetmc.com/Loader.aspx?ParTree=151311amp;i=2400322364771558')
    WebDriverWait(driver, 10).until(EC.staleness_of((By.ID, 'e5')))
    print(driver.find_element_by_id('e5').text)
    driver.close()
 

Я говорю об этом теге, если вы не можете его найти :

Расположение тега

Комментарии:

1. Вы имеете в виду, что хотите запускать скрипт и распечатывать #e5 текстовое значение каждый раз, когда оно менялось? Без тайм-аута?

Ответ №1:

Для этого есть ожидаемое условие:

 WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, 'e5')))
 

Вам не нужно ждать, пока элемент устареет, вам нужно, чтобы он был виден в DOM.

Комментарии:

1. Нет, это не работает, тег отображается, но не имеет никакого значения -> его пустой

Ответ №2:

Попробуйте этот код, чтобы постоянно проверять текстовое значение элементов

 import time

pause = 1 # set interval between value checks in seconds

field = driver.find_element_by_id('e5')
value = field.text

while True:
    if field.text != value:
        value = field.text
        print(value)
    time.sleep(pause)
 

Если вы хотите использовать WebDriverWait, попробуйте

 field = driver.find_element_by_id('e5')
value = field.text

while True:
    WebDriverWait(driver, float('inf')).until(lambda driver: field.text != value)
    value = field.text
    print(value)
 

Комментарии:

1. Да, это очень умный способ, есть ли другой способ?

2. @SinaOrg Я добавил другой способ, но все еще не могу его протестировать — час прошел, но значение то же самое 🙂

3. мне очень нравится ваш второй способ и я использую его, но нам не нужно время.sleep() в цикле, int не опасно?

4. @SinaOrg Я не уверен, что понимаю. Можете ли вы уточнить?

5. я думаю, что что-то вроде бесконечного цикла, если сайт загружается так быстро или занимает много оперативной памяти, чтобы цикл был таким быстрым