2013-11-15 8 views
9

Quello che sto cercando di realizzare è navigare in una pagina, in attesa di qualcosa da caricare e quindi prendere e salvare uno screenshot.Ottenere il selenio in pausa per X secondi

Il codice che già è

WebDriver driver = new FirefoxDriver(); 


driver.get("http://www.site.com"); 


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

try { 

    File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); 
    FileUtils.copyFile(scrFile, new File("/home/Desktop/image.png")); 

} catch (Exception e) { 

     e.printStackTrace(); 
} 

driver.close(); 

La ragione per cui ho bisogno di aspettare, anche se la pagina viene caricata è perché sarà caricato, ma sul sito del contenuto vorrei prendere un immagine dei carichi dopo pochi secondi. Per qualche motivo la pagina non è in attesa, c'è un altro metodo che posso usare per far sì che il driver/pagina attenda il numero X di secondi?

+0

Controlla questo post: http://stackoverflow.com/questions/5868439/wait-for-page-load-in-selenium – Gayathri

risposta

6

È possibile individuare un elemento che viene caricato dopo il caricamento iniziale della pagina e quindi attivare il Selenium finché tale elemento non viene trovato.

WebDriverWait wait = new WebDriverWait(driver, 10); 
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("ID"))); 
+1

Solo per menzionare che in questo approccio, l'ExpectedCondition viene testato ogni 500ms per vedere se la condizione è soddisfatta (qui che l'elemento "ID" è visibile) fino al timeout (qui impostato a 10). È possibile scrivere anche le proprie condizioni, per i predicati personalizzati. Documentazione disponibile qui: http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp – anotherdave

5

Quello non sarebbe davvero una cosa specifica al selenio. Devi solo che java dorma per un po 'dopo aver caricato la pagina ma prima di prendere lo screenshot.

Thread.sleep(4000); 

mettere quello dopo l'istruzione driver.get.

+2

l'unico motivo per cui non sto facendo upvoting è perché dovresti ** MAI ** ..... usare attese esplicite come questa. cattivo. – sircapsalot

+0

Quindi, se stava prendendo screenshot in ogni test in una suite di 1.000, e l'elemento normalmente veniva caricato dopo 500 ms, questo approccio aggiungeva un'ora al tempo di costruzione. – anotherdave

+0

@sircapsalot Se voglio che il mio browser rimanga aperto altri 2 secondi prima che si chiuda (chiamo .Quit()), come dovrei farlo? – MStodd

1

Nel caso in cui possa aiutare qualcuno, si dovrebbe sempre cercare di evitare le attese implicite e in particolare Thread#sleep il più possibile. Se lo fai Thread.sleep(10), il tuo codice sarà sempre attendere 10 secondi anche nel caso in cui la tua pagina sia pronta dopo 1 sec. Quindi questo può rallentare notevolmente i test se lo usi spesso.

Il modo migliore è utilizzare ExplicitWaits che significa che si aspetterà esattamente fino a quando si verifica qualche azione o qualche elemento viene visualizzato sulla pagina. Quindi nel tuo caso, userei l'attesa esplicita per verificare se è tutto caricato e quindi fare uno screenshot.

+0

Grazie per il collegamento ExplicitWaits, davvero aiutato! :) –

0

Se si vuole ritardare di un certo numero di secondi, piuttosto che a rispondere nel più breve tempo possibile, qui è una funzione per mettere in pausa simile a quello che il selenio IDE offre:

public void pause(Integer milliseconds){ 
    try { 
     TimeUnit.MILLISECONDS.sleep(milliseconds); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

source

Problemi correlati