Sobes.tech
Middle

Opowiedz o kilku rodzajach oczekiwania w Selenium.

sobes.tech AI

Odpowiedź od AI

W Selenium Webdriver używane są różne rodzaje oczekiwań, aby zsynchronizować działania skryptu z ładowaniem strony internetowej.

  1. Oczekiwanie domyślne (Implicit Wait): Ustawia maksymalny czas, w którym Selenium będzie próbowało znaleźć element na stronie, zanim rzuci wyjątek NoSuchElementException. Dotyczy to globalnie wszystkich operacji wyszukiwania elementów po jego ustawieniu.

    from selenium import webdriver
    
    # Tworzenie instancji drivera
    driver = webdriver.Chrome()
    
    # Ustawienie oczekiwania domyślnego (10 sekund)
    driver.implicitly_wait(10)
    
    # Kolejne operacje wyszukiwania elementów będą korzystać z tego oczekiwania
    # driver.get("http://example.com")
    # element = driver.find_element_by_id("some_id")
    
    # Zamknięcie drivera
    # driver.quit()
    
  2. Oczekiwanie jawne (Explicit Wait): Ustawia maksymalny czas na spełnienie określonego warunku, zanim rzuci wyjątek TimeoutException. Dotyczy konkretnego elementu lub warunku. Do jego użycia potrzebna jest klasa WebDriverWait i jedna z predefiniowanych lub konfigurowalnych "warunków oczekiwanych" (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
    
    # Tworzenie instancji drivera (nie jest potrzebne oczekiwanie domyślne tutaj, 
    # jeśli używa się jawnego dla konkretnych elementów)
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Ustawienie oczekiwania jawnego (10 sekund) na obecność elementu
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "some_id"))
        )
        # Dalsze działania z elementem
        # element.click()
    except:
        # Obsługa wyjątku, jeśli element nie zostanie znaleziony w ciągu 10 sekund
        print("Element nie został znaleziony w ciągu 10 sekund")
    
    # Ustawienie oczekiwania jawnego na klikalność elementu
    try:
        clickable_element = WebDriverWait(driver, 15).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
        )
        # clickable_element.click()
    except:
        print("Element nie stał się klikalny w ciągu 15 sekund")
    
    # Zamknięcie drivera
    # driver.quit()
    
  3. Oczekiwanie płynne (Fluent Wait): Podobne do oczekiwania jawnego, pozwala ustawić maksymalny czas oczekiwania i warunek. Dodatkowo pozwala określić interwał (polling interval) do sprawdzania warunku i listę wyjątków, które należy ignorować podczas oczekiwania.

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import FluentWait
    from selenium.common.exceptions import NoSuchElementException
    
    # Tworzenie instancji drivera
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Ustawienie oczekiwania płynnego
    wait = FluentWait(driver, timeout=30, poll_frequency=5,
                      ignored_exceptions=[NoSuchElementException])
    
    try:
        element = wait.until(lambda driver: driver.find_element(By.ID, "some_id"))
        # Dalsze działania z elementem
        # element.click()
    except:
        print("Element nie został znaleziony za pomocą oczekiwania płynnego")
    
    # Zamknięcie drivera
    # driver.quit()
    

Porównanie:

Rodzaj oczekiwania Zastosowanie Warunek Elastyczność Użycie
Domyślne Globalne Szukanie elementu Niska (tylko czas) Prosta konfiguracja dla wszystkich elementów
Jawne Konkretne Określony warunek Wysoka (czas, warunek) Oczekiwanie na konkretne stany elementów
Płynne Konkretne Określony warunek Najwyższa (czas, warunek, interwał, ignorowane wyjątki) Zaawansowane scenariusze oczekiwania z obsługą błędów