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);
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
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
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