selenium
Aspettando in selenio
Ricerca…
introduzione
Uno dei più comuni ostacoli per i nuovi utenti Selenium è l'attesa finché una pagina non è completamente caricata. Gli utenti umani possono facilmente capire se una pagina è stata caricata completamente o se sta ancora caricando. Il selenio, tuttavia, aspetta solo un determinato periodo di tempo. Pertanto, è spesso conveniente avere un buon modo per attendere elementi in una pagina. Anche se è possibile farlo con le funzioni loop e sleep (), nel Selenium sono già presenti molti altri metodi più puliti.
Aspetta esplicita in Python
Quando il browser naviga verso una pagina dinamica (più comunemente un'applicazione web basata su AJAX), gli elementi sulla pagina possono impiegare tempi di caricamento diversi e inoltre: alcuni elementi verranno caricati solo in risposta ad alcune azioni dell'utente. In questi casi, il recupero diretto di un elemento potrebbe non riuscire:
# Don't do this: may fail on dynamic page with ElementNotVisibleException
element = driver.find_element_by_name('q')
La soluzione più ovvia sembra introdurre l'attesa prima di recuperare elementi:
# Don't do this: inefficient solution for ElementNotVisibleException
time.sleep(5) # delays for 5 seconds
element = driver.find_element_by_name('q')
Ma tale soluzione è inefficiente, poiché fa sì che il test attenda sempre per 5 secondi, anche quando l'elemento nella maggior parte dei casi appare dopo 1 secondo (e solo a volte richiede fino a 5 secondi). Non sembra molto se è un posto, ma in genere ogni test si occupa di più elementi, e ci sono più test, che si sommano alla durata complessiva del test.
Una soluzione migliore è aspettare che l'elemento venga visualizzato per un massimo di 5 secondi, ma tornare dall'attesa non appena viene trovato un elemento. WebDriverWait
ti permette di fare proprio questo.
Il seguente esempio naviga su www.google.com, attende (per un massimo di 5 secondi) che la barra di ricerca venga caricata, quindi cerca "selenio".
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()
Aspetta in Java con selenio
Attesa esplicita : attendere che si verifichi una determinata condizione prima di procedere ulteriormente nel codice.
WebDriver driver = new FirefoxDriver();
driver.get("http://google.com");
WebElement myElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myElement")));
Attesa implicita: attendere una certa quantità di tempo quando si cerca di trovare un elemento o elementi se non sono immediatamente disponibili.
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://google.com");
WebElement myElement = driver.findElement(By.id("myElement"));