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"));


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow