2014-04-08 2 views
10

A volte nel mio test eseguito con Selenium 2.41 e testato con Firefox 28 l'esecuzione si blocca in attesa del caricamento della pagina.Firefox WebDriver si blocca in attesa della pagina da caricare

Questa è la condizione di attesa:

int time = 30;  
WebDriverWait wait = new WebDriverWait(webDriver, time); 
ExpectedCondition<Boolean> pageLoadCondition = new ExpectedCondition<Boolean>() { 
    public Boolean apply(WebDriver driver) { 
     return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete"); 
    } 
}; 
wait.until(pageLoadCondition); 

Si suppone che, dopo 30 secondi, questo metodo lancerà una TimeoutException, ma non è, a volte si blocca per sempre. Questa è la stacktrace prodotta in queste situazioni:

java.lang.Thread.State: RUNNABLE a java.net.SocketInputStream.socketRead0 (metodo natale) a java.net.SocketInputStream.read (fonte sconosciuta) a org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer (AbstractSessionInputBuffer.java:160) a org.apache.http.impl.io.SocketInputBuffer.fillBuffer (SocketInputBuffer.java:84) a org .apache.http.impl.io.AbstractSessionInputBuffer.readLine (AbstractSessionInputBuffer.java:273) allo org.apache.http .impl.conn.LoggingSessionInputBuffer.readLine (LoggingSessionInputBuffer.java:116) a org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead (DefaultHttpResponseParser.java:140) a org.apache.http.impl.conn .DefaultHttpResponseParser.parseHead (DefaultHttpResponseParser.java:57) a org.apache.http.impl.io.AbstractMessageParser.parse (AbstractMessageParser.java:260) a org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader (AbstractHttpClientConnection .java: 283) a org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader (DefaultClientConnection.java:251) a org.apache.htt p.impl.conn.AbstractClientConnAdapter.receiveResponseHeader (AbstractClientConnAdapter.java:223) a org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse (HttpRequestExecutor.java:271) a org.apache.http.protocol.HttpRequestExecutor. eseguire (HttpRequestExecutor.java:123) a org.apache.http.impl.client.DefaultRequestDirector.tryExecute (DefaultRequestDirector.java:682) a org.apache.http.impl.client.DefaultRequestDirector.execute (DefaultRequestDirector. java: 486) a org.apache.http.impl.client.AbstractHttpClient.doExecute (AbstractHttpClient.java:863) a org.apache.http.impl.client.CloseableHttpClient .execute (CloseableHttpClient.java:72) a org.apache.http.impl.client.CloseableHttpClient.execute (CloseableHttpClient.java:57) a org.openqa.selenium.remote.HttpCommandExecutor.fallBackExecute (HttpCommandExecutor.java : 322) a org.openqa.selenium.remote.HttpCommandExecutor.execute (HttpCommandExecutor.java:301) a org.openqa.selenium.firefox.internal.NewProfileExtensionConnection.execute (NewProfileExtensionConnection.java:165) a org.openqa.selenium.firefox.FirefoxDriver $ LazyCommandExecutor.execute (FirefoxDriver.java:362) allo org.openqa.selenium.remote.RemoteWebDriver.execute (RemoteWebDriver.java:568) a org.openqa.selenium.remote.RemoteWebDriver.executeScript (RemoteWebDriver.java:504) a es.tao.commonservices.selenium.tests.TAORobotWebDriver $ 1.Apply (TAORobotWebDriver.java:6227) a es.tao.commonservices.selenium.tests.TAORobotWebDriver $ 1.Apply (TAORobotWebDriver.java:1) a org.openqa.selenium.support.ui.FluentWait. fino (FluentWait.java:208) a es.tao.commonservices.selenium.tests.TAORobotWebDriver.waitToLoad (TAORobotWebDriver.java:6230) a es.tao.commonservices.selenium.tests.TAORobotWebDriver.handleWaitToLoad (TAORobotWebDriver. java: 6110)

ho impostare questa preferenza per il profilo di Firefox, ma non sta ancora lavorando:

ffProfile = new FirefoxProfile(); 
ffProfile.setPreference("webdriver.load.strategy", "unstable"); 

hanno anche questa proprietà impostate:

webDriver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS); 
webDriver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS); 
+0

Sareste aperti a una soluzione che utilizza un normale driver.get (url) ma poi utilizza un FLuentWait fino a quando non viene caricato un elemento previsto? – gorbysbm

+0

Ciao gorbysbm, sto sviluppando una specie di robot che testa l'applicazione. A volte non ho "l'elemento" da aspettare, quindi devo aspettare che il documento sia pronto. Ad ogni modo, aspettando che un elemento appaia, questo errore si verifica perché l'ho provato. Grazie! – vbail

+0

Solo una teoria, ma non userebbe FluentWait per aspettare che l'elemento "body" della pagina carichi apporti la stessa cosa? Non vedo fluente Aspetta il tuo codice dovrebbe assomigliare a questo: http://stackoverflow.com/questions/12041013/selenium-webdriver-fluent-wait-works-as-expected-but-implicit-wait-does-not . Perché non provi a liberarti di quel codice Javascript e vedi se fluentWait funzionerà – gorbysbm

risposta

1

Si consiglia di provare Firefox 27.01. Ho aggiornato a Firefox 28.0 e sembra che abbia rotto alcuni test che stavo facendo usando watir-webdriver. Sono tornato alla 27.01 e i test sono stati eseguiti di nuovo (se torni a scaricare l'intero pacchetto di installazione solo come configurazione, non sembra che tu possa disattivare l'aggiornamento automatico in modo che si aggiorni a 28.0).

I fallimenti stavano usando hover e find_element.

0

Trovato un bug non risolto: https://code.google.com/p/selenium/issues/detail?id=6955 - se possibile, si prega di fornire un caso di test, principalmente una pagina host ridotta con script minimi in cui il problema si verifica ancora in modo che possa essere ripetuto in modo affidabile e tracciato verso il basso.

A volte mi chiedo se Google utilizza i propri strumenti a tutti ... dovrebbero aver incappato in quel bug molto tempo fa considerando quanto sia enorme quell'azienda.