有时在我使用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:RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.read(未知来源)at 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.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:283) 在 org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:251) 在 org.apache.http.impl.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.tryExecute(DefaultRequestDirector.java:682) 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:486) 在 org.apache.http.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.firefox.FirefoxDriver $ LazyCommandExecutor.execute(FirefoxDriver.java:362) 在 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:568) 在 org.openqa.selenium.remote.RemoteWebDriver.executeScript(RemoteWebDriver.java:504) 在 es.tao.commonservices.selenium.tests.TAORobotWebDriver $ 1.适用(TAORobotWebDriver.java:6227) 在 es.tao.commonservices.selenium.tests.TAORobotWebDriver $ 1.适用(TAORobotWebDriver.java:1) 在 org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:208) 在 es.tao.commonservices.selenium.tests.TAORobotWebDriver.waitToLoad(TAORobotWebDriver.java:6230) 在 es.tao.commonservices.selenium.tests.TAORobotWebDriver.handleWaitToLoad(TAORobotWebDriver.java:6110)
我已经为firefox配置文件设置了这个首选项,但它仍然无效:
ffProfile = new FirefoxProfile();
ffProfile.setPreference("webdriver.load.strategy", "unstable");
还设置了此属性:
webDriver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
webDriver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
答案 0 :(得分:1)
您可能想尝试使用Firefox 27.01。我升级到Firefox 28.0,它似乎打破了我正在使用watir-webdriver进行的一些测试。我回到了27.01并且测试再次运行(如果你回去下载整个安装包只作为设置,似乎不能让你关闭自动更新,所以它自己更新到28.0)。
失败的是使用hover和find_element。
答案 1 :(得分:0)
发现一个未解决的错误:https://code.google.com/p/selenium/issues/detail?id=6955 - 如果可以,请提供一个测试用例,主要是一个简化的主页,其中包含最少的脚本,问题仍然存在,因此可以可靠地重复并追查。
有时我会质疑自己谷歌是否使用自己的工具......考虑到公司的规模有多大,他们应该在很久以前就遇到过这个问题。