Sök…


Introduktion

En av de vanligaste snubblorna för nyare Selenium-användare väntar tills en sida är fullastad. Mänskliga användare kan enkelt se om en sida har laddats fullständigt eller om den fortfarande laddas. Selenium väntar dock bara på en viss tid. Därför är det ofta bekvämt att ha ett bra sätt att vänta på element på en sida. Även om det är möjligt att göra detta med funktionerna loop och sleep () finns det mycket renare sätt som redan är inbyggda i Selenium.

Vänta i Python

När webbläsaren navigerar till en dynamisk sida (vanligtvis AJAX-baserad webbapplikation) kan elementen på sidan ta olika tid att ladda, och dessutom: vissa element laddas bara som svar på vissa användaråtgärder. I sådana fall kan direkt hämtning av ett element misslyckas:

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

Den mest uppenbara lösningen verkar att införa väntan innan du hämtar element:

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

Men en sådan lösning är ineffektiv, eftersom den får testet att alltid vänta i 5 sekunder, även när elementet i de flesta fall visas efter 1 sekund (och bara ibland kräver upp till 5 sekunder). Det ser inte mycket ut om det är ett ställe, men vanligtvis handlar varje test om flera element, och det finns flera tester, vilket ger en total testvaraktighet.

En bättre lösning är att vänta på att elementet ska visas i upp till 5 sekunder, men återgå från väntan så snart elementet hittas. WebDriverWait låter dig göra just det.

Följande exempel navigerar till www.google.com, väntar (i upp till 5 sekunder) för att sökfältet ska laddas och söker sedan efter "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()

Vänta i Java med selen

Explicit wait : Vänta tills ett visst tillstånd inträffar innan du fortsätter med koden.

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

Implicit wait: Vänta en viss tid när du försöker hitta ett element eller element om de inte är tillgängliga direkt.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow