2012-11-27 14 views
6

Sto effettuando il test del selenio per la prima volta. Sulla homepage, chiamo alcuni AJAX e voglio che il selenio attenda che l'elemento carichi la finitura. Non sono sicuro che funzioni, ma scrivo solo selenio e waitForCondition è in grado di scegliere.Selenium waitForCondition

Non importa quello che scelgo, restituisce sempre "falso". Non lo so ora se lo waitForCondition funziona anche?

Come posso verificare se funziona? E cosa sto facendo di sbagliato in questo codice?

selenium.waitForCondition("//input[@name='Report'", "3000"); 
selenium.waitForCondition("//*[@id='MyTable']", "3000"); 
selenium.waitForCondition("css=.someClass2", "3000"); 

Se implemento dalla propria classe - è tornare "vero"

private boolean isElementPresent(By by) { 
    try { 
     driver.findElement(by); 
     return true; 
    } catch (NoSuchElementException e) { 
     return false; 
    } 
} 

isElementPresent (By.xpath ("// * [= @ id 'MyTable']")) - ritorno " true "

risposta

3

waitForCondition è solo per le chiamate Javascript, non per l'attesa di elementi da caricare.

Quello che hai in isElementPresent va bene. Vorrei combinarlo con attese esplicite per essere un po 'più precisa su quando un elemento è effettivamente caricata e presente sullo schermo:

http://seleniumhq.org/docs/04_webdriver_advanced.html

+0

va bene, questo lavoro. Esiste un esempio di ciò che si usa in JAVA. Penso che questo sia un sacco di codice che ho bisogno di scrivere ogni volta che lo uso. WebElement myDynamicElement = (new WebDriverWait (conducente, 10)). Fino a (nuova ExpectedCondition () { \t \t \t \t @Override \t \t \t \t WebElement public apply (WebDriver d) { \t \t \t \t \t return d.findElement (By.id ("MyTable")); \t \t \t \t}}); ' – boje

+0

@Arran questa soluzione lavori. Sto svalutando. Grazie per la soluzione. – RNS

0

Aaran lei ha fatto riferimento alla documentazione corretta per Selenium WebDriver waits.

Si può vedere che scrivono anche sulla classe ExpectedConditions. Questo contiene diverse utili implementazioni delle classi ExpectedCondition, ad esempio "is element present one", che è ExpectedConditions.presenceOfElementLocated.

Ecco un esempio di utilizzo:

WebDriver driver = new ChromeDriver(); 
driver.get("http://www.degraeve.com/reference/simple-ajax-example.php"); 

driver.findElement(By.name("word")).sendKeys("bird is the word");; 
driver.findElement(By.cssSelector("input[type='button']")).click(); 
WebDriverWait driverWait = new WebDriverWait(driver, 10); 
WebElement dynamicElement = driverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#result p"))); 
System.out.println(dynamicElement.getText()); 

Se lo trovate troppo prolisso, perché non ti basta refactoring ed estrarre una funzione che accetterà il localizzatore elemento e il WebDriver, e ritorna tu l'elemento?

DriverWait.until() che accetta un'istanza ExpectedCondition è come un modo per passare una funzione di predicato, semplicemente eseguendo una classe o nell'esempio di documentazione una classe nidificata anonima, poiché in Java non è possibile inviare una funzione .

La "funzione" ExpectedCondition che si passa anche restituisce un valore, che può essere utile nel caso in cui si sta aspettando una condizione su qualche elemento (o qualche altro valore dal WebDriver), quindi restituirlo ti farà risparmiare un extra chiamata.

+0

Per qualche motivo, le Condizioni_specifiche_ non sono note. Testo: ExpectedConditions non può essere risolto – boje

+0

Per qualche motivo non ho _org.openqa.selenium.support.ui.ExpectedConditions_ Dove posso trovare il file jar corretto? Ho org.openqa.selenium.support.ui.ExpectedCondition (senza "S" su) – boje

+0

Quale versione di selenio stai usando? Ho testato il codice su 2.25.0, tramite Maven, ma è disponibile per il download all'indirizzo http://seleniumhq.org/download/ –

1

Si può fare in questo modo:

selenium.waitForCondition("selenium.isElementPresent(\"//input[@name='Report']\")", "30000"); 

Questo attenderà l'elemento da caricare fino a 30 secondi.

+0

Questo non funziona. Secondo @Arran, _waitForCondition_ è solo per le chiamate Javascript. Questo viene fatto tramite JAVA e IE8 – boje

+0

Dovrebbe funzionare ... Per testare un'applicazione basata su jax, preferisco sempre questo metodo. Vedi questo link http://www.seleniumwiki.com/selenium-rc/using-selenium-waitforcondition/ –

1

Spero che questo funziona per voi

new WebDriverWait(driver, 30).until(new ExpectedCondition<Boolean>() { 
public Boolean apply(WebDriver driver) { 
    JavascriptExecutor js = (JavascriptExecutor) driver; 
    return (Boolean) js.executeScript("return jQuery.active == 0"); 
} 

});

Verificherà se la libreria jQuery ha richieste AJAX attive per 30 secondi.

2

C#

Si può fare in questo modo:

Prima di tutto è possibile impostare il valore di timeout per la condizione.

Quindi è possibile utilizzare la condizione.

var Wait = new WebDriverWait(GlobalDriver, TimeSpan.FromMinutes(1)); 
Wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("xPath")))); 

O

Wait.Until(driver => driver.FindElement(By.XPath("xPath"))); 

Questo è tutto.

0

Prova questa volta:

await().atMost(10, SECONDS).until(() -> driver.findElements(By.id("elementId")).size() >1);