Sobes.tech
Middle

Papaskinkite apie keletą laukimo tipų Selenium.

sobes.tech AI

Atsakymas iš AI

Selenium Webdriver naudojami įvairūs laukimo būdai, siekiant sinchronizuoti skripto veiksmus su tinklalapio įkėlimu:

  1. Numatytasis laukimas (Implicit Wait): Nustato maksimalų laiką, kurį Selenium bandys rasti elementą puslapyje, prieš išmetant NoSuchElementException. Tai taikoma visiems elementų paieškos veiksmams po nustatymo.

    from selenium import webdriver
    
    # Tvarkyklės objekto sukūrimas
    driver = webdriver.Chrome()
    
    # Numatytasis laukimas (10 sekundžių)
    driver.implicitly_wait(10)
    
    # Tolimesni elementų paieškos veiksmai naudosis šiuo laukimu
    # driver.get("http://example.com")
    # element = driver.find_element_by_id("some_id")
    
    # Tvarkyklės uždarymas
    # driver.quit()
    
  2. Aiškus laukimas (Explicit Wait): Nustato maksimalų laiką, per kurį turi būti įvykdyta tam tikra sąlyga, prieš išmetant TimeoutException. Taikoma konkrečiam elementui ar sąlygai. Tam reikalingas WebDriverWait klasė ir vienas iš iš anksto apibrėžtų arba pritaikomų "laukimo sąlygų" (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
    
    # Tvarkyklės objekto sukūrimas (čia nereikalingas numatytasis laukimas, 
    # jei naudojamas aiškus laukimas konkretiems elementams)
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Aiškaus laukimo nustatymas (10 sekundžių) elemento buvimo patikrinimui
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "some_id"))
        )
        # Tolimesni veiksmai su elementu
        # element.click()
    except:
        # Išimtis apdorojimas, jei elementas nerandamas per 10 sekundžių
        print("Elementas nerastas per 10 sekundžių")
    
    # Aiškaus laukimo nustatymas (15 sekundžių) paspaudžiamumo patikrinimui
    try:
        clickable_element = WebDriverWait(driver, 15).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
        )
        # clickable_element.click()
    except:
        print("Elementas nepasidarė paspaudžiamas per 15 sekundžių")
    
    # Tvarkyklės uždarymas
    # driver.quit()
    
  3. Lankstus laukimas (Fluent Wait): Panašus į aiškų laukimą, leidžia nustatyti maksimalų laukimo laiką ir sąlygą. Taip pat galima nurodyti patikrinimo intervalą (polling interval) ir išimtis, kurias reikia ignoruoti laukimo metu.

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import FluentWait
    from selenium.common.exceptions import NoSuchElementException
    
    # Tvarkyklės objekto sukūrimas
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Lankstaus laukimo nustatymas
    wait = FluentWait(driver, timeout=30, poll_frequency=5,
                      ignored_exceptions=[NoSuchElementException])
    
    try:
        element = wait.until(lambda driver: driver.find_element(By.ID, "some_id"))
        # Tolimesni veiksmai su elementu
        # element.click()
    except:
        print("Lankstaus laukimo pagalba elementas nerastas")
    
    # Tvarkyklės uždarymas
    # driver.quit()
    

Palyginimas:

Laukimo tipas Taikymas Sąlyga Lankstumas Naudojimas
Numatytasis Globalus Elemento paieška Žemas (tik laikas) Paprasta konfigūracija visiems elementams
Aiškus Konkrečiai Nustatyta sąlyga Aukštas (laikas, sąlyga) Konkretūs elementų būsenų laukimai
Lankstus Konkrečiai Nustatyta sąlyga Aukščiausias (laikas, sąlyga, intervalas, ignoruoti išimtis) Sudėtingi laukimo scenarijai su klaidų valdymu