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.
-
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() -
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 klasaWebDriverWaiti 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() -
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 |