2014-04-08 9 views
10

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

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

+0

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

+0

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

Odpowiedz

1

Możesz spróbować Firefox 27.01. Uaktualniłem Firefoksa do wersji 28.0 i wydawało mi się, że przerywam niektóre testy, które robiłem przy użyciu watir-webdrivera. Wróciłem do 27.01 i testy zostały uruchomione ponownie (jeśli wrócisz pobrać cały pakiet instalacyjny tylko jako konfigurację, to nie pozwala ci wyłączyć automatycznej aktualizacji, więc aktualizuje się do 28.0).

Awaria za pomocą hover i find_element.

0

Znaleziono nierozwiązany błąd: https://code.google.com/p/selenium/issues/detail?id=6955 - jeśli możesz, podaj przypadek testowy, przede wszystkim stronę o zmniejszonej liczbie hostów z minimalnymi skryptami, w których problem nadal występuje, aby można go było niezawodnie powtórzyć i prześledzić.

Czasami zastanawiam się, czy Google w ogóle korzysta z własnych narzędzi. Powinni byli zbiec do tego błędu przed wiekami, biorąc pod uwagę, jak ogromna jest ta firma.

Powiązane problemy