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 …
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); }