2012-05-03 17 views
10

Dopo un evento click ho bisogno di aspettare un elementi di attributo di cambiare prima di procedere ulteriormente (clicca evento fa sì che alcuni elementi per spostare fuori fuoco e di alcuni altri ottenere attenzione attraverso un JS)Le migliori pratiche per aspettare un cambiamento con Selenium Webdriver?

Dopo aver trascorso tempo alla ricerca di un affidabile alternativa a "waitForAttribute" (comando selenio 1) in webdriver ... Potrei ottenere il codice seguente per funzionare. Ma non sono sicuro che questa sia la migliore implementazione ...

Qualunque altra soluzione migliore ??

wait = new WebDriverWait(wedriver1, TimeSpan.FromSeconds(5)); 
..... 
button.Click(); 
wait.Until(webdriver1 => webdriver2.webelement.GetAttribute("style").Contains("display: block")); 

Inoltre, chiunque può condividere un collegamento su come gestire le modifiche agli eventi AJAX utilizzando il webdriver.

+0

http://assertselenium.com/2013/01/29/webdriver-wait-commands/ ha un bel elenco di possibili metodi di attesa e come si relazionano – Pat

+0

@Pat: il il sito web di assertselenium.com sembra essere sparito. –

+0

Versioni archiviate di quella pagina: http://web.archive.org/web/*/http://assertselenium.com/2013/01/29/webdriver-wait-commands/ – Pat

risposta

5

È un problema ricorrente del selenio. Non sono sicuro di una "migliore" implementazione esistente. Credo che dipenda in gran parte dalla situazione.

Per quanto riguarda le modifiche basate su AJAX, generalmente utilizzo waitForElementPresent o waitForElementNotPresent in base alle modifiche apportate dalla chiamata AJAX sulla pagina.

+2

Questo funzionerà, ma solo per le situazioni dove un elemento appare/scompare. Ci sono molte situazioni in cui un elemento rimane visibile ma cambia un attributo, che penso che l'OP chiedesse, che questi metodi non coprono. –

0

È possibile utilizzare Thread.sleep come persone hanno implementato here.. È possibile utilizzare le loro implementazioni per mettere in relazione al tuo problema.

public void waitFor(Webdriver driver,,WebElement welElem, String attributeValue){ 
    int timeout=0; 
    while(true){ 
     if(driver.webElem.getAttribute(attribute)!=null){ 
     break; 
     } 
     if(timeout>=10){ 
     break; 
     } 
     Thread.sleep(100); 
     timeout++; 
    } 

} 

Penso che potresti implementare qualcosa di simile. Non l'ho controllato ma hai capito.

+2

Credo che l'intero ciclo while sia quello che sta facendo "wait.Until" che ho postato sopra. Quindi non vedo il punto di scrivere questo ciclo while esplicito. Suppongo che la mia implementazione che funziona sia molto più pulita – Adi

+1

'while (timeout <10)' e cancella l'istruzione 'if'. Solo una nota per il tuo codice. –

4

È possibile utilizzare implicita WebDriver attesa:

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

Un'attesa implicita è di dire a WebDriver di interrogare il DOM per un certo periodo di tempo quando si cerca di trovare un elemento o elementi se non sono immediatamente disponibili.

Maggiori informazioni qui: http://seleniumhq.org/docs/04_webdriver_advanced.html#implicit-waits

+0

Scusa, non penso che tu abbia capito la mia domanda. I miei elementi attribuiscono le modifiche a un evento click (guidato da JS). Non vedo come l'attesa implicita sia utile qui. Dalla mia comprensione l'attesa implicita è più rilevante nel caso in cui gli elementi siano visibili dopo un evento. – Adi

2

sento che utilizzando il WebDriverWait è molto utile. È possibile utilizzare una modifica nel codice:

webelement.isDisplayed(); 

invece di ottenere l'attributo di stile.

4

Suggerisco di utilizzare org.openqa.selenium.support.ui.ExpectedConditions.attributeToBe(WebElement element, String attribute, String value).

ad es.

WebDriverWait wait = new WebDriverWait(driver, 5); // time out after 5 seconds 
someElement.click(); 
wait.until(ExpectedConditions.attributeToBe(someElement, "sort-attribute", "ascending")); 

(docs)

Problemi correlati