2012-10-02 15 views
6

Sto lavorando su un sistema che ha un frontend web che sto testando con Selenium. Su una pagina il contenuto viene caricato dinamicamente durante lo scorrimento verso il basso (forse lo sai dall'elenco di amici di Facebook), perché è uno dei requisiti.Test del contenuto caricato dinamicamente con Selenium Web Driver

Lo scorrimento verso il basso con selenio Web (utilizzo Chrome) non dovrebbe essere un problema tramite Javascript. Ma c'è un problema con il contenuto aggiunto dinamicamente. Come posso fare in modo che il Webdriver trovi quegli elementi?

Ho provato quanto segue per scorrere verso il basso fino a quando non è più contenuto viene caricato:

int oldSize = 0; 
int newSize = 0; 
do { 
    driver.executeScript("window.scrollTo(0,document.body.scrollHeight)"); 
    newSize = driver.findElementsBy(By.cssSelector("selector").size(); 
} while(newSize > oldSize); 

Ma se la pagina scorre verso il basso la prima volta e qualche ora contenuto viene caricato correttamente, non saranno trovati dai piloti funzione findElementsBy (By).

Qualcuno ha mai affrontato questo problema ?? Sarei molto felice se qualcuno potesse aiutarmi a trovare una soluzione per questo!

saluti, Benjamin

+0

dovrò scorrere verso il basso, al fine di caricare gli elementi (tramite la tecnologia AJAX). Come ho detto uso Chromedriver. –

risposta

0

Credo che il problema è in attesa del contenuto dinamico per completare il caricamento. Prova ad aspettare 3 secondi prima di findElementsBy? In C# il codice sarebbe Thread.Sleep (3000);

+0

buona idea, provalo ... findElements fornisce ancora solo gli elementi che sono stati caricati dall'inizio su –

+0

@Benjamin: hai provato più a lungo come 5 secondi? Potresti verificare in SeleniumIDE che il selettore css funzioni quando l'elemento è presente?Farei un test in IDE, ma è complicato simulare lo scroll - puoi provare keyPress | xpath =/html/body/| 34 (keycode 34 è paginato), quindi waitForElementPresent ... – pellucid

+0

non funzionerò comunque con SeleniumIDE ... –

4

Si consiglia di utilizzare WebDriverWait con ExpectedConditons.

//scroll down with Javascript first 
WebDriverWait wait = new WebDriverWait(driver, 30); 
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("selector"))); 
//interact with your element 
element.click() 

Date un'occhiata alla indicazioni fornite dalla Selenio Pagina ufficiale: http://seleniumhq.org/docs/04_webdriver_advanced.html

+0

+1. approccio non male, ma mi sembra meglio scegliere l'attesa fluente per questo caso. –

1

provare a utilizzare attesa fluente in particolare. La caratteristica principale è:

Un'implementazione dell'interfaccia di attesa che può avere il proprio intervallo di timeout e polling configurato al volo. Ogni istanza di FluentWait definisce la quantità massima di tempo di attesa per una condizione, nonché la frequenza con cui controllare la condizione. Inoltre, l'utente può configurare l'attesa per ignorare determinati tipi di eccezioni durante l'attesa, come NoSuchElementExceptions durante la ricerca di un elemento nella pagina.

public WebElement fluentWait(final By locator){ 
     Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
       .withTimeout(30, TimeUnit.SECONDS) 
       .pollingEvery(5, TimeUnit.SECONDS) 
       .ignoring(NoSuchElementException.class); 

     WebElement foo = wait.until(
new Function<WebDriver, WebElement>() { 
      public WebElement apply(WebDriver driver) { 
         return driver.findElement(locator); 
       } 
       } 
); 
          return foo;    }  ; 

Il metodo descritto si ritorna elemento web è possibile operare con. Quindi l'approccio è il seguente: 1) è necessario trovare i selettori di elementi che si prevede di eseguire il rendering dopo lo scorrimento di ad es.

String cssSelector = "blablabla" 

2) scorrere verso il basso con js 3)

WebElement neededElement = fluentWait(cssSelector); 
neededElement.click(); 
//neededElement.getText().trim(); 

potete acquistare più informazioni su attesa fluente here

+1

Ho solo una domanda: come si fa una nuova funzione in Java considerando che non esiste una funzione che si struttura? L'esempio sopra menzionato è menzionato anche in javadoc di selenio, ma javac mi darà un simbolo non in grado di trovare: class Function - Vorrei capire quale parte mi sia mancata nella presa per permettermi di usare l'approccio sopra descritto. – Vatsala

+0

potresti chiarirmi un po ': che cosa citi nel dire che la funzione templating in Java? –

+1

Non sono sicuro di cosa intenda dire "function templating" ma la nuova funzione () {crea l'istanza della classe anonima passata a wait.until La funzione è definita nell'API di selenio. fino a (com.google.common.base.Function isTrue) Applica ripetutamente il valore di input di questa istanza alla funzione specificata finché si verifica una delle seguenti condizioni: la funzione non restituisce né null né false, la funzione genera un'eccezione non firmata, la timeout scade, il thread corrente viene interrotto Eventuali problemi complie - sembra che tu non abbia impostato correttamente le impostazioni IDE (IMHO) –

Problemi correlati