#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. я думаю, что что-то вроде бесконечного цикла, если сайт загружается так быстро или занимает много оперативной памяти, чтобы цикл был таким быстрым