Suche…


Einführung

Einer der häufigsten Stolpersteine ​​für neuere Selenium-Benutzer wartet, bis eine Seite vollständig geladen ist. Benutzer können leicht feststellen, ob eine Seite vollständig geladen wurde oder ob sie noch geladen wird. Selen wartet jedoch nur eine bestimmte Zeit. Daher ist es oft praktisch, eine gute Möglichkeit zu haben, auf Elemente auf einer Seite zu warten. Während es möglich ist , dies mit einer Schleife und sleep () Funktionen zu tun, gibt es viel saubere Weise bereits in Selenium gebaut.

Explizites Warten in Python

Wenn der Browser zu einer dynamischen Seite (meist AJAX-basierte Webanwendung) navigiert, kann das Laden der Elemente auf der Seite unterschiedlich lange dauern. Außerdem werden einige Elemente nur als Reaktion auf bestimmte Benutzeraktionen geladen. In solchen Fällen kann das direkte Abrufen eines Elements fehlschlagen:

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

Die naheliegendste Lösung scheint das Warten vor dem Abrufen von Elementen einzuführen:

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

Eine solche Lösung ist jedoch ineffizient, da der Test immer 5 Sekunden wartet, selbst wenn das Element in den meisten Fällen nach 1 Sekunde erscheint (und manchmal nur bis zu 5 Sekunden benötigt). Es sieht nicht viel aus, wenn es sich um einen Ort handelt, aber normalerweise werden bei jedem Test mehrere Elemente verwendet, und es gibt mehrere Tests, die sich auf die Gesamtdauer des Tests auswirken.

Eine bessere Lösung ist das Warten auf das Erscheinen des Elements für bis zu 5 Sekunden, das Warten jedoch, sobald das Element gefunden wurde. WebDriverWait können Sie genau dies tun.

Das folgende Beispiel navigiert zu www.google.com, wartet (bis zu 5 Sekunden), bis die Suchleiste geladen ist, und sucht dann nach "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()

Warten Sie in Java mit Selen

Explizites Warten : Warten Sie auf eine bestimmte Bedingung, bevor Sie im Code fortfahren.

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

Implizite Wartezeit: Warten Sie eine bestimmte Zeit, wenn Sie versuchen, ein Element oder Elemente zu finden, wenn diese nicht sofort verfügbar sind.

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow