4

私の Selenium テストは、CI で頻繁に無期限にハングアップし、常に新しいページをロードしようとしますdriver.get。PhantomJS 1.9.8 を使用しています。

数回のデバッグの後、Web ページの読み込みが PhantomJS で完了しないという問題を突き止めたと思います。

Selenium RemoteWebDriver が PhantomJS/GhostDriver にリクエストを送信し、応答を待っています。

GhostDriver は引き続きリクエストを受け付けています。ヒットすることでスタックしているページを確認できます。さらに、コマンドラインから同じページcurl http://localhost:port/session/:sessionId/urlを再リクエストすると ( )、ブロックされた Selenium リクエストが中断したところから魔法のように再開されます。curl -d '{"url": ...}' http://localhost:port/session/:sessionId/url

更新: Ghostdriver 自体はハングしていません。ただし、デフォルトのタイムアウトは基本的に無限です。ページ読み込みタイムアウトを指定すると、たとえばmanage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS)PhantomJS で問題が発生すると、GhostDriver はタイムアウト付きのエラー応答を返し、テストは失敗し、ビルドは続行されます。

PhantomJS 自体をデバッグすると (--debug=TRUE)、失敗した時点でこれがログの最後に表示されます。

2015-03-21T21:26:39 [DEBUG] WebPage - updateLoadingProgress: 86 (その後、タイムアウトになるまで何もありません)

ハングした時点での Java 側からのスタック トレースは次のようになります。

"Forwarding get on session fd1ac2c0-ccd4-11e4-a596-a1f7b09caa5d to remote" prio=10 tid=0x0000000001f74800 nid=0x5cc3 runnable [0x00002b87c3039000]
 java.lang.Thread.State: RUNNABLE
     at java.net.SocketInputStream.socketRead0(Native Method)
     at java.net.SocketInputStream.read(SocketInputStream.java:150)
     at java.net.SocketInputStream.read(SocketInputStream.java:121)
     at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)
     at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)
     at horg.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:281)
     at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:92)
     at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62)
     at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
     at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
     at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
     at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:219)
     at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
     at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
     at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:712)
     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:517)
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
     at org.openqa.selenium.remote.HttpCommandExecutor.fallBackExecute(HttpCommandExecutor.java:316)
     at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:295)
     at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:66)
     at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:527)
     at org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDriver.java:276)
     at org.openqa.selenium.WebDriver$get.call(Unknown Source)
     at geb.Browser.go(Browser.groovy:371)
     at geb.Browser$go.call(Unknown Source)
     at geb.Page.to(Page.groovy:169)

これと似ていますが、Firefox の代わりに PhantomJS を使用しています。

Firefox WebDriver がページのロードを待機してハングする

4

1 に答える 1