Zoeken…


Invoering

Een van de meest voorkomende struikelblokken voor nieuwere Selenium-gebruikers wacht tot een pagina volledig is geladen. Menselijke gebruikers kunnen gemakkelijk zien of een pagina volledig is geladen of nog steeds wordt geladen. Selenium wacht echter gewoon een bepaalde tijd. Daarom is het vaak handig om op een goede manier te wachten op elementen op een pagina. Hoewel het mogelijk is om dit te doen met de functies loop en sleep (), zijn er veel schonere manieren ingebouwd in Selenium.

Expliciet wachten in Python

Wanneer de browser naar een dynamische pagina navigeert (meestal AJAX-gebaseerde webapplicatie), kan het laden van de elementen op de pagina even duren en bovendien: sommige elementen worden alleen geladen als reactie op bepaalde gebruikersacties. In dergelijke gevallen kan het direct ophalen van een element mislukken:

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

De meest voor de hand liggende oplossing lijkt het wachten te introduceren voordat elementen worden opgehaald:

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

Maar een dergelijke oplossing is inefficiënt, omdat het ervoor zorgt dat de test altijd 5 seconden wacht, zelfs wanneer het element in de meeste gevallen na 1 seconde verschijnt (en soms slechts tot 5 seconden vereist). Het ziet er niet veel uit als het op één plaats is, maar meestal behandelt elke test meerdere elementen en zijn er meerdere tests, wat de totale testduur oploopt.

Een betere oplossing is om te wachten tot het element maximaal 5 seconden verschijnt, maar keert terug van het wachten zodra het element is gevonden. WebDriverWait kunt u precies dat doen.

Het volgende voorbeeld navigeert naar www.google.com, wacht (maximaal 5 seconden) totdat de zoekbalk is geladen en zoekt vervolgens naar "selenium".

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()

Wacht op Java met selenium

Expliciet wachten : wacht tot een bepaalde voorwaarde optreedt voordat u verder gaat in de code.

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

Impliciet wachten: wacht een bepaalde tijd wanneer u probeert een element of elementen te vinden als deze niet onmiddellijk beschikbaar zijn.

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow