Sobes.tech
Middle

Pastāstiet par dažādiem gaidīšanas veidiem Selenium.

sobes.tech AI

Atbilde no AI

Selenium Webdriver izmanto dažādus gaidīšanas veidus, lai sinhronizētu skripta darbības ar tīmekļa lapas ielādi:

  1. Nopietns gaidīšanas veids (Implicit Wait): Nosaka maksimālo laiku, cik Selenium mēģinās atrast elementu lapā, pirms izmet NoSuchElementException. Tas tiek piemērots visām elementu meklēšanas operācijām pēc tā iestatīšanas.

    from selenium import webdriver
    
    # Vadītāja objekta izveide
    driver = webdriver.Chrome()
    
    # Nopietns gaidīšanas veids (10 sekundes)
    driver.implicitly_wait(10)
    
    # Nākamās meklēšanas operācijas izmantos šo gaidīšanu
    # driver.get("http://example.com")
    # element = driver.find_element_by_id("some_id")
    
    # Vadītāja aizvēršana
    # driver.quit()
    
  2. Skaidrs gaidīšanas veids (Explicit Wait): Nosaka maksimālo laiku, lai izpildītu noteiktu nosacījumu, pirms izmet TimeoutException. Tas tiek piemērots konkrētam elementam vai nosacījumam. Tam nepieciešams WebDriverWait klases un viens no iepriekš definētiem vai pielāgotiem "gaidīšanas nosacījumiem" (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
    
    # Vadītāja objekta izveide (šeit nav nepieciešama kopējā gaidīšana, 
    # ja tiek izmantota skaidra gaidīšana konkrētiem elementiem)
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Skaidras gaidīšanas iestatīšana (10 sekundes) elementa klātbūtnei
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "some_id"))
        )
        # Turpmākās darbības ar elementu
        # element.click()
    except:
        # Izņēmuma apstrāde, ja elements netiek atrasts 10 sekundēs
        print("Elements netika atrasts 10 sekundēs")
    
    # Skaidras gaidīšanas iestatīšana (15 sekundes) klikšķējamībai
    try:
        clickable_element = WebDriverWait(driver, 15).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
        )
        # clickable_element.click()
    except:
        print("Elements nav kļuvusi klikšķējama 15 sekundēs")
    
    # Vadītāja aizvēršana
    # driver.quit()
    
  3. Elastīga gaidīšana (Fluent Wait): Līdzīga skaidrai gaidīšanai, bet ļauj iestatīt maksimālo gaidīšanas laiku un nosacījumu. Papildus, var norādīt intervālu (polling interval) un izņēmumu sarakstu, kurus jāignorē gaidīšanas laikā:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import FluentWait
    from selenium.common.exceptions import NoSuchElementException
    
    # Vadītāja objekta izveide
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Elastīgas gaidīšanas iestatīšana
    wait = FluentWait(driver, timeout=30, poll_frequency=5,
                      ignored_exceptions=[NoSuchElementException])
    
    try:
        element = wait.until(lambda driver: driver.find_element(By.ID, "some_id"))
        # Turpmākās darbības ar elementu
        # element.click()
    except:
        print("Elastīga gaidīšana neatrada elementu")
    
    # Vadītāja aizvēršana
    # driver.quit()
    

Salīdzinājums:

Gaidīšanas veids Piemērošana Nosacījums Elastīgums Lietošana
Nopietns Globāls Elementa meklēšana Zems (tikai laiks) Vienkārša konfigurācija visiem elementiem
Skaidrs Konkrēts Noteikts nosacījums Augsts (laiks, nosacījums) Gaidīšana uz konkrētām elementu stāvokļiem
Elastīgs Konkrēts Noteikts nosacījums Visaugstākais (laiks, nosacījums, intervāls, ignorēt izņēmumus) Sarežģīti gaidīšanas scenāriji ar kļūdu apstrādi