selenium
Väntar i Selenium
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"));