Гузариш ба мундариҷа
Мавзӯи 4 аз 6

Интизорӣ

Бисёр сайтҳо саҳифаро фавран нишон медиҳанд, маълумотро бошад каме баъдтар бор мекунанд: ҷадвал баъди як сония пайдо мешавад, тугма баъди санҷиши форма фаъол мешавад. Агар барнома элементро фавран ҷӯяд — он ҳоло нест.

Роҳи бад — time.sleep

import time

button.click()
time.sleep(5)                                  # «шояд дар 5 сония бор шавад»
driver.find_element(By.ID, "data")

Агар сайт дар 0.2 сония ҷавоб дод — барнома беҳуда боз 4.8 сония интизор мешавад. Агар дар 6 — ба ҳар ҳол меафтад. Садҳо чунин интизориҳо барномаро ба сангпушт табдил медиҳанд.

Роҳи хуб — WebDriverWait

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)               # на зиёда аз 10 сония интизор шудан
element = wait.until(EC.visibility_of_element_located((By.ID, "data")))
print(element.text)

until шартро ҳар ним сония месанҷад ва натиҷаро ҳамон замон бармегардонад, ки шарт иҷро шуд. Интизор нашуданд — истиснои TimeoutException.

Шартҳои маъмул (EC.…):

Шарт Интизор мешавад, то
presence_of_element_located(лок) элемент дар HTML пайдо шавад
visibility_of_element_located(лок) элемент намоён шавад
element_to_be_clickable(лок) элемент намоён ва фаъол бошад
text_to_be_present_in_element(лок, матн) матни элемент сатрро дар бар гирад
invisibility_of_element_located(лок) элемент нопадид шавад (масалан, «спиннер»)
url_contains(қисм) суроғаи саҳифа иваз шавад

Локатор — кортежи (By.ID, "data"), бинобар ин қавсҳо дугонаанд.

Агар интизор нашуданд, чӣ бояд кард

from selenium.common.exceptions import TimeoutException

try:
    wait.until(EC.text_to_be_present_in_element((By.ID, "status"), "Натиҷа:"))
except TimeoutException:
    print("сервер ҷавоб надод")

Шартеро интихоб кунед, ки воқеан «тайёр»-ро ифода мекунад: элемент бо калимаи «Боргирӣ…» фавран намоён аст, аммо дар он ҳоло натиҷа нест.

Хулоса

  • маълумот баъдтар бор мешавад — элементҳо фавран пайдо намешаванд;
  • WebDriverWait(driver, сония).until(EC.…) ба ҷои time.sleep;
  • visibility_of_element_located, text_to_be_present_in_element, element_to_be_clickable;
  • TimeoutException, агар интизор нашуданд.