Sobes.tech
Middle

Vertel over enkele soorten wachten in Selenium.

sobes.tech AI

Antwoord van AI

In Selenium Webdriver worden verschillende soorten wachttijden gebruikt om de acties van het script te synchroniseren met het laden van de webpagina.

  1. Impliciete wacht (Implicit Wait): Stelt de maximale tijd in dat Selenium probeert een element op de pagina te vinden voordat het een NoSuchElementException gooit. Het wordt globaal toegepast op alle zoekoperaties na het instellen.

    from selenium import webdriver
    
    # Maak een driver instantie
    driver = webdriver.Chrome()
    
    # Stel impliciete wacht in (10 seconden)
    driver.implicitly_wait(10)
    
    # Verdere zoekoperaties gebruiken deze wacht
    # driver.get("http://example.com")
    # element = driver.find_element_by_id("some_id")
    
    # Sluit de driver
    # driver.quit()
    
  2. Expliciete wacht (Explicit Wait): Stelt de maximale tijd in voor het uitvoeren van een bepaalde voorwaarde voordat een TimeoutException wordt gegooid. Het wordt toegepast op een specifiek element of voorwaarde. Hiervoor wordt de klasse WebDriverWait en een van de vooraf gedefinieerde of aangepaste "verwachte voorwaarden" (expected conditions) gebruikt.

    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
    
    # Maak een driver instantie (geen impliciete wacht nodig als expliciet wordt gebruikt)
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Stel expliciete wacht in (10 seconden) voor aanwezigheid van element
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "some_id"))
        )
        # Verdere acties met het element
        # element.click()
    except:
        # Verwerking als het element niet binnen 10 seconden wordt gevonden
        print("Element niet gevonden binnen 10 seconden")
    
    # Stel expliciete wacht in voor klikbaarheid van het element
    try:
        clickable_element = WebDriverWait(driver, 15).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
        )
        # clickable_element.click()
    except:
        print("Element werd niet klikbaar binnen 15 seconden")
    
    # Sluit de driver
    # driver.quit()
    
  3. Flexibele wacht (Fluent Wait): Vergelijkbaar met expliciete wacht, stelt de maximale wachttijd en voorwaarde in. Daarnaast kan het interval (polling interval) worden ingesteld voor het controleren van de voorwaarde en een lijst van uitzonderingen die genegeerd moeten worden tijdens het wachten.

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import FluentWait
    from selenium.common.exceptions import NoSuchElementException
    
    # Maak een driver instantie
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Stel flexibele wacht in
    wait = FluentWait(driver, timeout=30, poll_frequency=5,
                      ignored_exceptions=[NoSuchElementException])
    
    try:
        element = wait.until(lambda driver: driver.find_element(By.ID, "some_id"))
        # Verdere acties met het element
        # element.click()
    except:
        print("Element niet gevonden met behulp van flexibele wacht")
    
    # Sluit de driver
    # driver.quit()
    

Vergelijking:

Soort wacht Toepassing Voorwaarde Flexibiliteit Gebruik
Impliciet Globaal Element zoeken Laag (alleen tijd) Eenvoudige instelling voor alle elementen
Expliciet Specifiek Bepaalde voorwaarde Hoog (tijd, voorwaarde) Wachten op specifieke toestanden van elementen
Flexibel Specifiek Bepaalde voorwaarde Hoogst (tijd, voorwaarde, interval, negeren van uitzonderingen) Complexe wachtscenario's met foutafhandeling