有时在我使用 Selenium 2.41 完成的测试并使用 Firefox 28 进行测试时,执行挂起等待页面加载。
这是等待条件:
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);
假设 30 秒后此方法会抛出 TimeoutException,但事实并非如此,有时会永远挂起。这是在这些情况下产生的堆栈跟踪:
java.lang.Thread.State:在 org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer. java:160) 在 org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:84) 在 org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:273) 在 org.apache .http.impl.conn.LoggingSessionInputBuffer.readLine(LoggingSessionInputBuffer.java:116) 在 org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140) 在 org.apache.http.impl.conn.DefaultHttpResponseParser .parseHead(DefaultHttpResponseParser.java:57) 在 org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:260) 在 org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:251) 在 org.apache.http.impl 的 org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:283) .conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:223) 在 org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:271) 在 org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123 ) 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:486) 在 org.apache.http 的 org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:682)。 impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57) 在 org.openqa.selenium .remote.HttpCommandExecutor.fallBackExecute(HttpCommandExecutor.java:322) 在 org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:301) 在 org.openqa.selenium.firefox.internal.NewProfileExtensionConnection.execute(NewProfileExtensionConnection.java :165) 在 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:568) 在 org.openqa.selenium 的 org.openqa.selenium.firefox.FirefoxDriver$LazyCommandExecutor.execute(FirefoxDriver.java:362)。 remote.RemoteWebDriver.executeScript(RemoteWebDriver.java:504) 在 es.tao.commonservices.selenium.tests.TAORobotWebDriver$1。在 es.tao.commonservices.selenium.tests.TAORobotWebDriver$1.apply(TAORobotWebDriver.java:1) 在 org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:208) 申请(TAORobotWebDriver.java:6227) ) 在 es.tao.commonservices.selenium.tests.TAORobotWebDriver.handleWaitToLoad(TAORobotWebDriver.java:6110) 的 es.tao.commonservices.selenium.tests.TAORobotWebDriver.waitToLoad(TAORobotWebDriver.java:6230)
我已经为 Firefox 配置文件设置了这个首选项,但它仍然无法正常工作:
ffProfile = new FirefoxProfile();
ffProfile.setPreference("webdriver.load.strategy", "unstable");
也有这个属性集:
webDriver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
webDriver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);