Sobes.tech
Middle

სელენიუმში რამდენიმე ელოდების ტიპის შესახებ ისაუბრეთ.

sobes.tech AI

პასუხი AI-სგან

სელენიუმის WebDriver-ში გამოიყენება სხვადასხვა ტიპის მოლოდინები, რომლებიც გამოიყენება სკრიპტის მოქმედებებისა და ვებგვერდის ჩატვირთვის სინქრონიზაციისთვის:

  1. მიმდინარე მოლოდინი (Implicit Wait): განსაზღვრავს მაქსიმალურ დროს, რომლის განმავლობაში Selenium ცდილობს ელემენტის მოძებნას გვერდზე, სანამ გამოიწვევს NoSuchElementException გამონაკლისს. იგი გლობალურად ვრცელდება ყველა ელემენტის ძიების ოპერაციაზე მისი დაყენების შემდეგ.

    from selenium import webdriver
    
    # დრაივერის ობიექტის შექმნა
    driver = webdriver.Chrome()
    
    # მოლოდინის დაყენება (10 წამი)
    driver.implicitly_wait(10)
    
    # შემდეგი ძიების ოპერაციები გამოიყენებენ ამ მოლოდინს
    # driver.get("http://example.com")
    # element = driver.find_element_by_id("some_id")
    
    # დრაივერის დახურვა
    # driver.quit()
    
  2. საზოგადო მოლოდინი (Explicit Wait): განსაზღვრავს მაქსიმალურ დროს გარკვეული პირობის შესრულებისთვის, სანამ გამოიწვევს TimeoutException გამონაკლისს. იგი გამოიყენება კონკრეტული ელემენტის ან პირობისთვის. მისი გამოყენებისთვის საჭიროა WebDriverWait კლასი და ერთ-ერთი წინასწარ განსაზღვრული ან მორგებული "მოლოდინები" (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
    
    # დრაივერის ობიექტის შექმნა (აქ არ არის საჭირო მოლოდინი, თუ კონკრეტული ელემენტებისთვის გამოიყენება)
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # მოლოდინის დაყენება (10 წამი) ელემენტის არსებობისთვის
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "some_id"))
        )
        # შემდეგი მოქმედებები ელემენტთან
        # element.click()
    except:
        # გამონაკლისის დამუშავება, თუ ელემენტი 10 წამში ვერ მოიძებნა
        print("ელემენტი ვერ მოიძებნა 10 წამში")
    
    # მოლოდინის დაყენება (15 წამი) ელემენტის კლიკაობისათვის
    try:
        clickable_element = WebDriverWait(driver, 15).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
        )
        # clickable_element.click()
    except:
        print("ელემენტი ვერ გახდა კლიკაბელი 15 წამში")
    
    # დრაივერის დახურვა
    # driver.quit()
    
  3. მოძრავი მოლოდინი (Fluent Wait): მსგავსია გამოხატული მოლოდინის, მაგრამ საშუალებას აძლევს დააყენოს მაქსიმალური დრო და პირობა. დამატებით, შესაძლებელია მიუთითოს გამოკითხვების ინტერვალი (polling interval) და გამონაკლისების სია, რომლებიც უნდა იგნორირდეს მოლოდინის დროს:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import FluentWait
    from selenium.common.exceptions import NoSuchElementException
    
    # დრაივერის ობიექტის შექმნა
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # მოქნილი მოლოდინის დაყენება
    wait = FluentWait(driver, timeout=30, poll_frequency=5,
                      ignored_exceptions=[NoSuchElementException])
    
    try:
        element = wait.until(lambda driver: driver.find_element(By.ID, "some_id"))
        # შემდეგი მოქმედებები ელემენტთან
        # element.click()
    except:
        print("მოძრავი მოლოდინით ელემენტი ვერ მოიძებნა")
    
    # დრაივერის დახურვა
    # driver.quit()
    

შედარება:

მოლოდინის ტიპი გამოყენება პირობა მოქნილობა გამოყენება
არაპირდაპირი გლობალური ელემენტის ძიება დაბალი (მხოლოდ დრო) მარტივი კონფიგურაცია ყველა ელემტისთვის
გამოხატული კონკრეტული განსაზღვრული პირობა მაღალი (დრო, პირობა) კონკრეტული მდგომარეობების მოლოდინი
მოქნილი კონკრეტული განსაზღვრული პირობა უმაღლესი (დრო, პირობა, ინტერვალი, გამონაკლისების იგნორირება) რთული მოლოდინების სცენარები, შეცდომების მართვა