【问题标题】:Firefox WebDriver hangs waiting for page to loadFirefox WebDriver 挂起等待页面加载
【发布时间】:2014-05-20 23:09:24
【问题描述】:

有时在我使用 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: 可运行于 java.net.SocketInputStream.socketRead0(本机方法)在 java.net.SocketInputStream.read(Unknown Source) 在 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.apply(TAORobotWebDriver.java:6227) 在 es.tao.commonservices.selenium.tests.TAORobotWebDriver$1.apply(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);

【问题讨论】:

  • 您是否愿意接受使用普通 driver.get(url) 但随后使用 FLuentWait 直到加载预期元素的解决方案?
  • 嗨 gorbysbm,我正在开发一种测试应用程序的机器人。有时我没有要等待的“the”元素,所以我必须等到文档准备好。无论如何,等待一个元素出现这个错误会发生,因为我已经尝试过了。谢谢!
  • 只是一个理论,但不会使用 FluentWait 等待页面的“body”元素加载完成同样的事情吗?我在您的代码中看不到 fluentWait 它应该是这样的:stackoverflow.com/questions/12041013/…。你为什么不尝试摆脱那些 Javascript 代码,看看 fluentWait 是否可以工作
  • Selenium 2.42 和 Firefox 28 也有同样的问题。Firefox 状态栏会永远显示“正在从 XXX 传输数据...”,并且永远不会将控制权返回给 Selenium。在控制台中,document.readyState 停留在“正在加载”。
  • 我遇到了类似的问题并通过更改等待方法解决了它。但在我的情况下,相同的 java script wait 已在太多地方使用,因此替换它对我来说是一个很大的风险。所以我只在代码实际挂起的地方更改了java脚本等待方法。

标签: selenium selenium-webdriver selenium-firefoxdriver


【解决方案1】:

发现了一个未解决的错误:https://code.google.com/p/selenium/issues/detail?id=6955 - 如果可以,请提供一个测试用例,主要是一个带有最少脚本的精简主机页面,但问题仍然存在,以便可以可靠地重复和追踪。

有时我会质疑自己 Google 是否使用他们自己的工具......考虑到这家公司的规模有多大,他们应该在很久以前就遇到过这个错误。

【讨论】:

    【解决方案2】:

    您可能想尝试 Firefox 27.01。我升级到 Firefox 28.0,它似乎打破了我使用 watir-webdriver 进行的一些测试。我回到 27.01 并再次运行测试(如果您返回下载整个安装包仅作为安装程序,似乎不允许您关闭自动更新,因此它会自行更新到 28.0)。

    失败是使用 hover 和 find_element。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-09
      • 2012-07-07
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多