【问题标题】:long running selenium test - Browser dies长时间运行的硒测试 - 浏览器死机
【发布时间】:2013-04-29 18:02:51
【问题描述】:

我有一个 selenium 测试,它在应用程序上执行一组重复的操作,以准确测试多次执行同一件事时会发生什么。这是通过无限循环完成的,因为我实际上不需要通过/失败,我只需要看看它是否在 2/4/8/24/48 小时内仍然存在。我遇到的问题是某些东西导致我的浏览器在夜间死机。

Driver info: driver.version: RemoteWebDriver
[junit]     at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:493)
[junit]     at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:244)
[junit]     at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:77)
[junit]     at wl12cStartServers.<method1>(<testname>.java:66)
[junit]     at wl12cStartServers.<method2>(<testname>.java:34)
[junit] Caused by: java.net.SocketTimeoutException: Read timed out

这与我要杀死由 selenium 启动的浏览器窗口时出现的错误相同,但我不知道是什么导致它在这种情况下死亡。 我在看的时候已经看到脚本运行了几个小时..

【问题讨论】:

  • 这听起来可能很简单,但是您的计算机在夜间不会进入睡眠模式,还是有什么问题?
  • 我也得到了类似的东西,老实说,当你把视线移开时,硒就会掉下来。
  • 我意识到这也发生在我身上。浏览器就死了。有时,在某个地方,很难复制。唯一的解决方法是不断检查浏览器是否仍然存在,如果没有,请重新启动它...
  • 任何浏览器都会出现这种情况,您使用的是同一个浏览器吗?
  • 我只用 Firefox 尝试过这个。我的机器晚上不睡觉,但值得检查!

标签: java selenium webdriver


【解决方案1】:

正如用户 KPZ 所建议的,问题可能出在测试期间计算机进入睡眠模式(或任何类似模式)。试试这个对策:

private static Timer screenSaverDisabler;

/** Moves mouse once in a minute and therefore prevents the screen saver from kicking in. */
private static void disableScreenSaver() {
    screenSaverDisabler = new Timer();
    screenSaverDisabler.scheduleAtFixedRate(new TimerTask() {
        Robot r = null;
        // initialization block
        {
            try {
                r = new Robot();
            } catch (AWTException headlessEnvironmentException) {
                screenSaverDisabler.cancel();
            }
        }
        @Override
        public void run() {
            Point loc = MouseInfo.getPointerInfo().getLocation();
            r.mouseMove(loc.x + 1, loc.y);
            r.mouseMove(loc.x, loc.y);
        }
    }, 0, 59*1000);
}

另外,完成后不要忘记致电screenSaverDisabler.cancel();


如果这没有帮助,我不知道是什么导致了问题。如果你不知道,有一个明显的解决方案:

这是一个可恢复的异常!在你的主循环中添加一个try-catch 块,它将捕获这个问题(捕获任何RemoteWebdriverException 并过滤掉那些不是由SocketTimeoutException 引起的)并重新启动浏览器。

【讨论】:

  • 好主意,但是如果我的应用程序死掉了怎么办?我假设我会因超时错误而失败?
  • @confusified 我不确定我是否理解正确。您是否需要一个浏览器实例来测试应用程序?这意味着一旦浏览器死机,您就不能在结束时继续测试?哦,那样的话,我们确实需要找到浏览器崩溃的原因。
  • 场景 1 - 浏览器因未知原因死机,这意味着我的应用程序仍将正常运行。我的测试将在发现任何问题之前结束。如果浏览器在第 5 次迭代中死机,并且我重新启动测试,它将从第 1 次迭代重新开始,这将失败,因为第 1 次迭代尚未从上一次运行中清除。这有任何意义吗?场景 2 - 应用程序死亡。在这种情况下,错误可能会导致错误,并且 selenium 将由于断言而结束,或者在最坏的情况下,由于搜索某些元素时出现超时错误,正如预期的那样。
  • @confusified 场景 1 对我来说很清楚,你是对的,很遗憾,简单地重新启动浏览器并不是一个真正的选择。所以我的解决方案并不真正可行。我会删除答案。场景 2 没问题,问题会很好地传播,测试会根据需要失败。
  • 我会留下答案,因为它对不在我的确切情况下的人仍然有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
相关资源
最近更新 更多