Szukaj…


Wprowadzenie

Jednym z najczęstszych przeszkód dla nowszych użytkowników Selenium jest oczekiwanie na pełne załadowanie strony. Użytkownicy mogą łatwo stwierdzić, czy strona została w pełni załadowana lub czy nadal się ładuje. Selen czeka jednak tylko na określony czas. Dlatego często wygodnie jest czekać na elementy na stronie. Chociaż można to zrobić za pomocą funkcji loop i sleep (), w Selenium są już znacznie czystsze sposoby.

Jawne oczekiwanie w Pythonie

Gdy przeglądarka przechodzi do strony dynamicznej (najczęściej aplikacji internetowej opartej na AJAX), elementy na stronie mogą się ładować w innym czasie, a ponadto: niektóre elementy ładują się tylko w odpowiedzi na niektóre działania użytkownika. W takich przypadkach bezpośrednie pobieranie elementu może się nie powieść:

# Don't do this: may fail on dynamic page with ElementNotVisibleException
element = driver.find_element_by_name('q') 

Najbardziej oczywistym rozwiązaniem wydaje się wprowadzenie oczekiwania przed pobraniem elementów:

# Don't do this: inefficient solution for ElementNotVisibleException 
time.sleep(5) # delays for 5 seconds  
element = driver.find_element_by_name('q') 

Ale takie rozwiązanie jest nieefektywne, ponieważ powoduje, że test zawsze czeka 5 sekund, nawet jeśli element w większości przypadków pojawia się po 1 sekundzie (i tylko czasami wymaga do 5 sekund). Nie wygląda zbyt dobrze, jeśli jest to jedno miejsce, ale zwykle każdy test dotyczy wielu elementów, a istnieje wiele testów, co stanowi całkowity czas trwania testu.

Lepszym rozwiązaniem jest oczekiwanie na pojawienie się elementu do 5 sekund, ale powrót z czekania, gdy tylko element zostanie znaleziony. WebDriverWait pozwala to zrobić.

Poniższy przykład prowadzi do www.google.com, czeka (do 5 sekund) na załadowanie paska wyszukiwania, a następnie wyszukuje hasło „selen”.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

# Create a new chromedriver instance
driver = webdriver.Chrome()

# Go to www.google.com
driver.get("https://www.google.com")

try:
    # Wait as long as required, or maximum of 5 sec for element to appear
    # If successful, retrieves the element
    element = WebDriverWait(driver,5).until(
         EC.presence_of_element_located((By.NAME, "q")))

    # Type "selenium"
    element.send_keys("selenium")
    
    #Type Enter
    element.send_keys(Keys.ENTER)

except TimeoutException:
    print("Failed to load search bar at www.google.com")
finally:
    driver.quit()

Poczekaj w Javie z selenem

Jawne oczekiwanie : poczekaj na wystąpienie określonego warunku, zanim przejdziesz dalej do kodu.

WebDriver driver = new FirefoxDriver();
driver.get("http://google.com");
WebElement myElement = (new WebDriverWait(driver, 10))
  .until(ExpectedConditions.presenceOfElementLocated(By.id("myElement")));

Niejawne czekanie: Poczekaj pewien czas, próbując znaleźć element lub elementy, jeśli nie są one natychmiast dostępne.

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://google.com");
WebElement myElement = driver.findElement(By.id("myElement"));


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow