Czasami w moim teście wykonanym przy pomocy Selenium 2.41 i przetestowanym z Firefoksem 28 wykonanie zostanie zawieszone w oczekiwaniu na załadowanie strony.Firefox WebDriver zawiesza się czekając na załadowanie strony
Jest to stan oczekiwania:
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);
To przypuszczenie, że po 30 sekundach ta metoda rzuci TimeoutException, ale to nie jest, czasami zawiesza się zawsze. To StackTrace produkowane w następujących sytuacjach:
java.lang.Thread.State: Runnable w java.net.SocketInputStream.socketRead0 (metoda podstawowa) na java.net.SocketInputStream.read (Unknown Source) w org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer (AbstractSessionInputBuffer.java:160) w org.apache.http.impl.io.SocketInputBuffer.fillBuffer (SocketInputBuffer.java:84) w org .apache.http.impl.io.AbstractSessionInputBuffer.readLine (AbstractSessionInputBuffer.java:273) pod adresem org.apache.http .impl.conn.LoggingSessionInputBuffer.readLine (LoggingSessionInputBuffer.java:116) w org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead (DefaultHttpResponseParser.java:140) w org.apache.http.impl.conn .DefaultHttpResponseParser.parseHead (DefaultHttpResponseParser.java:57) w org.apache.http.impl.io.AbstractMessageParser.parse (AbstractMessageParser.java:260) w org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader (AbstractHttpClientConnection .java: 283) pod adresem org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader (DefaultClientConnection.java:251) pod adresem org.apache.htt p.impl.conn.AbstractClientConnAdapter.receiveResponseHeader (AbstractClientConnAdapter.java:223) w org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse (HttpRequestExecutor.java:271) w org.apache.http.protocol.HttpRequestExecutor. execute (HttpRequestExecutor.java:123) na org.apache.http.impl.client.DefaultRequestDirector.tryExecute (DefaultRequestDirector.java:682) w org.apache.http.impl.client.DefaultRequestDirector.execute (DefaultRequestDirector. java: 486) pod adresem org.apache.http.impl.client.AbstractHttpClient.doExecute (AbstractHttpClient.java:863) pod adresem org.apache.http.impl.client.CloseableHttpClient .Execute (CloseableHttpClient.java:72) w org.apache.http.impl.client.CloseableHttpClient.execute (CloseableHttpClient.java:57) w org.openqa.selenium.remote.HttpCommandExecutor.fallBackExecute (HttpCommandExecutor.java : 322) w org.openqa.selenium.remote.HttpCommandExecutor.execute (HttpCommandExecutor.java:301) w org.openqa.selenium.firefox.internal.NewProfileExtensionConnection.execute (NewProfileExtensionConnection.java:165) w org.openqa.selenium.firefox.FirefoxDriver $ LazyCommandExecutor.execute (FirefoxDriver.java:362) pod adresem org.openqa.selenium.remote.RemoteWebDriver.execute (RemoteWebDriver.java:568) pod adresem org.openqa.selenium.remote.RemoteWebDriver.executeScript (RemoteWebDriver.java:504) pod adresem es.tao.commonservices.selenium.tests.TAORobotWebDriver $ 1.apply (TAORobotWebDriver.java:6227) na es.tao.commonservices.selenium.tests.TAORobotWebDriver $ 1.apply (TAORobotWebDriver.java:1) na org.openqa.selenium.support.ui.FluentWait. aż do zawartości (FluentWait.java:208) w es.tao.commonservices.selenium.tests.TAORobotWebDriver.waitToLoad (TAORobotWebDriver.java:6230) w es.tao.commonservices.selenium.tests.TAORobotWebDriver.handleWaitToLoad (TAORobotWebDriver. Java: 6110)
mam ustawić tę preferencję dla profilu firefox, ale to nadal nie działa:
ffProfile = new FirefoxProfile();
ffProfile.setPreference("webdriver.load.strategy", "unstable");
mają także ustawić ogłoszenia:
webDriver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
webDriver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
Czy byłbyś otwarty na rozwiązanie, które używa normalnego pliku driver.get (url), ale używa FLuentWait do momentu załadowania oczekiwanego elementu? – gorbysbm
Cześć, Gorbysbm, rozwijam rodzaj robota, który testuje aplikację. Czasami nie mam "tego" elementu, na który trzeba czekać, więc muszę poczekać, aż dokument będzie gotowy. W każdym razie, czekanie, aż element pojawi się ten błąd, stanie się, ponieważ próbowałem. Dzięki! – vbail
Tylko teoria, ale nie przy użyciu FluentWait czekać na element "body" strony, aby załadować osiągnąć to samo? Nie widzę fluentWait w twoim kodzie powinien wyglądać tak: http://stackoverflow.com/questions/12041013/selenium-webdriver-fluent-wait-works-as-expected-but-implicit-wait-does-not . Dlaczego nie spróbujesz pozbyć się tego kodu Javascript i sprawdzić, czy fluentWait zadziała – gorbysbm