Интизорӣ
Бисёр сайтҳо саҳифаро фавран нишон медиҳанд, маълумотро бошад каме баъдтар бор мекунанд: ҷадвал баъди як сония пайдо мешавад, тугма баъди санҷиши форма фаъол мешавад. Агар барнома элементро фавран ҷӯяд — он ҳоло нест.
Роҳи бад — 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, агар интизор нашуданд.