我的 Selenium 测试经常无限期地挂在 CI 上,总是尝试加载新页面driver.get
。我正在使用 PhantomJS 1.9.8。
经过几轮调试,我想我已经将问题追溯到 PhantomJS 中网页加载未完成的问题。
Selenium RemoteWebDriver 已向 PhantomJS/GhostDriver 发送请求,并且正在等待响应。
GhostDriver 仍在接受请求。我可以通过点击查看它卡在哪个页面上curl http://localhost:port/session/:sessionId/url
此外,如果我重新请求同一页从命令行(curl -d '{"url": ...}' http://localhost:port/session/:sessionId/url
)然后被阻止的 Selenium 请求会神奇地从中断处恢复。
UPDATE: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)
感觉与此类似,但使用 PhantomJS 而不是 Firefox:
Firefox WebDriver 挂起等待页面加载