Equivalente di waitForVisible / waitForElementPresent nei test Selenium WebDriver utilizzando Java?

Con i test del selenium “HTML” (creati con Selenium IDE o manualmente), è ansible utilizzare alcuni comandi molto utili come WaitForElementPresent o WaitForVisible .

  waitForElementPresent id=saveButton   

Quando si codificano i test del selenium in Java (Webdriver / Selenium RC-I’m non sono sicuro della terminologia qui), c’è qualcosa di simile incorporato ?

Ad esempio, per verificare che una finestra di dialogo (che richiede un po ‘di tempo per essere aperta) sia visibile …

 WebElement dialog = driver.findElement(By.id("reportDialog")); assertTrue(dialog.isDisplayed()); // often fails as it isn't visible *yet* 

Qual è il modo più efficace per codificare tale controllo?

Aggiungere chiamate Thread.sleep() dappertutto sarebbe brutto e fragile, e rotolare il tuo mentre i loop sembrano piuttosto goffi anche …

    Attese implicite ed esplicite

    Attesa implicita

    Un’attesa implicita è di dire a WebDriver di interrogare il DOM per una certa quantità di tempo quando si cerca di trovare un elemento o elementi se non sono immediatamente disponibili. L’impostazione predefinita è 0. Una volta impostata, l’attesa implicita viene impostata per la durata dell’istanza dell’object WebDriver.

     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 

    Attesa esplicita + condizioni previste

    Un’attesa esplicita è il codice che si definisce per attendere che si verifichi una determinata condizione prima di procedere ulteriormente nel codice. Il caso peggiore è Thread.sleep (), che imposta la condizione su un periodo di tempo esatto da attendere. Ci sono alcuni metodi di convenienza che ti aiutano a scrivere codice che attenderà solo il tempo necessario. WebDriverWait in combinazione con ExpectedCondition è un modo in cui questo può essere realizzato.

     WebDriverWait wait = new WebDriverWait(driver, 10); WebElement element = wait.until( ExpectedConditions.visibilityOfElementLocated(By.id("someid"))); 
     WebElement myDynamicElement = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement"))); 

    Questo attende fino a 10 secondi prima di lanciare un TimeoutException o se trova che l’elemento lo restituirà tra 0 e 10 secondi. WebDriverWait di default chiama la ExpectedCondition ogni 500 millisecondi finché non ritorna correttamente. Un risultato positivo per il tipo ExpectedCondition è Boolean return true o non null valore di ritorno per tutti gli altri tipi di ExpectedCondition.


     WebDriverWait wait = new WebDriverWait(driver, 10); WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid"))); 

    L’elemento è selezionabile: è visualizzato e abilitato.

    Da documenti WebDriver: attese esplicite e implicite

    Beh, la cosa è che probabilmente non vuoi che il test funzioni a tempo indeterminato. Devi solo aspettare un periodo di tempo più lungo prima che la biblioteca decida che l’elemento non esiste. In tal caso, la soluzione più elegante è quella di utilizzare l’attesa implicita, progettata proprio per questo:

     driver.manage().timeouts().implicitlyWait( ... ) 

    Per i singoli elementi è ansible utilizzare il seguente codice:

     private boolean isElementPresent(By by) { try { driver.findElement(by); return true; } catch (NoSuchElementException e) { return false; } } for (int second = 0;; second++) { if (second >= 60){ fail("timeout"); } try { if (isElementPresent(By.id("someid"))){ break; } } catch (Exception e) { } Thread.sleep(1000); }