Sobes.tech
Middle

Дар бораи чанд навъи интизорӣ дар Selenium гап зан.

sobes.tech AI

Ҷавоб аз AI

У Selenium Webdriver се използват различни видове очаквания за синхронизация на действията на скрипта с зареждането на уеб страницата.

  1. Косвено очакване (Implicit Wait): Определя максималното време, през което Selenium ще се опита да намери елемент на страницата, преди да изхвърли изключение NoSuchElementException. То се прилага глобално към всички операции по търсене на елементи след неговото задаване.

    from selenium import webdriver
    
    # Създаване на екземпляр на драйвера
    driver = webdriver.Chrome()
    
    # Задаване на косвено очакване (10 секунди)
    driver.implicitly_wait(10)
    
    # Следващите операции по търсене на елементи ще използват това очакване
    # driver.get("http://example.com")
    # element = driver.find_element_by_id("some_id")
    
    # Затваряне на драйвера
    # driver.quit()
    
  2. Явно очакване (Explicit Wait): Определя максималното време за изпълнение на определено условие, преди да изхвърли изключение TimeoutException. То се прилага към конкретен елемент или условие. За неговото използване е необходим класът WebDriverWait и един от предварително дефинираните или настройваеми "очаквани условия" (expected conditions).

    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
    
    # Създаване на екземпляр на драйвера (тук не е необходима неявна очакване, 
    # ако се използва явна за конкретни елементи)
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Задаване на явното очакване (10 секунди) за наличието на елемент
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "some_id"))
        )
        # Следващи действия с елемента
        # element.click()
    except:
        # Обработка на изключението, ако елементът не бъде намерен за 10 секунди
        print("Елементът не е намерен за 10 секунди")
    
    # Задаване на явното очакване за кликваемост на елемента
    try:
        clickable_element = WebDriverWait(driver, 15).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
        )
        # clickable_element.click()
    except:
        print("Елементът не стана кликваем за 15 секунди")
    
    # Затваряне на драйвера
    # driver.quit()
    
  3. Гъвкаво очакване (Fluent Wait): Подобно на явното очакване, позволява да се зададе максимално време за очакване и условие. Освен това позволява да се посочи интервал (polling interval) за проверка на условието и списък с изключения, които трябва да се игнорират по време на очакването.

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import FluentWait
    from selenium.common.exceptions import NoSuchElementException
    
    # Създаване на екземпляр на драйвера
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Задаване на гъвкаво очакване
    wait = FluentWait(driver, timeout=30, poll_frequency=5,
                      ignored_exceptions=[NoSuchElementException])
    
    try:
        element = wait.until(lambda driver: driver.find_element(By.ID, "some_id"))
        # Следващи действия с елемента
        # element.click()
    except:
        print("Елементът не е намерен с помощта на гъвкаво очакване")
    
    # Затваряне на драйвера
    # driver.quit()
    

Сравнение:

Вид очакване Приложение Условие Гъвкавост Използване
Неявно Глобално Търсене на елемент Ниска (само време) Лесна настройка за всички елементи
Явно Конкретно Определено условие Висока (време, условие) Очакване на конкретни състояния на елементите
Гъвкаво Конкретно Определено условие Висока (време, условие, интервал, игнориране на изключения) Сложни сценарии за очакване с обработка на грешки