17

我正在使用 WebDriver 和 Firefox 运行几个测试。

我遇到了以下命令的问题:

WebDriver.get(www.google.com);

使用此命令,WebDriver 会阻塞,直到触发 onload 事件。虽然这通常需要几秒钟,但在永远不会完成加载的网站上可能需要几个小时。

我想做的是在某个超时后停止加载页面,以某种方式模拟 Firefox 的停止按钮。

每次尝试加载页面时,我首先尝试执行以下 JS 代码:

var loadTimeout=setTimeout(\"window.stop();\", 10000);

不幸的是,这不起作用,可能是因为:

由于加载脚本的顺序,stop() 方法无法阻止包含它的文档加载1

更新 1:我尝试使用 SquidProxy 来添加连接和请求超时,但问题仍然存在。

我今天发现的一件奇怪的事情是,一个网站在我的机器(FF3.6 - 4.0 和 Mac Os 10.6.7)上从未停止加载,但在其他浏览器和/或计算机上正常加载。

更新 2:这个问题显然可以通过告诉 Firefox 不要加载图像来解决。希望在那之后一切都会好起来……

我希望 WebDriver 有一个更好的 Chrome 驱动程序以便使用它。Firefox 每天都让我失望!

更新 3:Selenium 2.9 添加了一个新功能来处理驱动程序似乎挂起的情况。这可以使用FirefoxProfile如下:

FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("web");
firefoxProfile.setPreference("webdriver.load.strategy", "fast");

我会在我尝试后发布这是否有效。

更新 4:最后,上述方法均无效。我最终“杀死”了需要很长时间才能完成的线程。我打算尝试Ghostdriver,它是一个使用 PhantomJS 作为后端的远程 WebDriver。PhantomJS 是一个无头的 WebKit 脚本,所以我希望不会有真正的浏览器(如 firefox)的问题。对于没有义务使用 firefox(爬行目的)的人,我将更新结果

更新5:更新时间。使用 ghostdriver 1.1 代替 FirefoxDriver 5 个月,我可以说我对他的性能和稳定性感到非常满意。我遇到了一些情况,我们没有适当的行为,但看起来一般 ghostdriver 足够稳定。因此,如果您像我一样需要用于爬行/网络抓取的浏览器,我建议您使用 ghostdriver 而不是 firefox 和 xvfb,这会让您头疼...

4

8 回答 8

6

我能够通过做一些事情来解决这个问题。

首先,为 webdriver 设置超时。例如,

WebDriver wd;
... initialize wd ...
wd.manage().timeouts().pageLoadTimeout(5000, TimeUnit.MILLISECONDS);

其次,在做你的事情时,将它包裹在 TimeoutException 周围。(我在那里添加了一个 UnhandledAlertException 捕获只是为了很好的衡量。)例如,

for (int i = 0; i < 10; i++) {
    try {
        wd.get(url);
        break;
    } catch (org.openqa.selenium.TimeoutException te) {
        ((JavascriptExecutor)wd).executeScript("window.stop();");
    } catch (UnhandledAlertException uae) {
        Alert alert = wd.switchTo().alert();
        alert.accept();
    }
 }

这基本上尝试加载页面,但如果超时,它会强制页面停止通过 javascript 加载,然后尝试再次获取页面。它可能对您的情况没有帮助,但它肯定对我有帮助,特别是在执行 webdriver 的getCurrentUrl()命令时,该命令也可能需要很长时间,有警报,并要求页面在您获得 url 之前停止加载。

于 2014-02-18T16:23:16.607 回答
2

我的解决方案是使用这个类 WebDriverBackedSelenium

//When creating a new browser:
WebDriver driver = _initBrowser(); //Just returns firefox WebDriver
WebDriverBackedSelenium backedSelenuium = 
            new WebDriverBackedSelenium(driver,"about:blank");    

//This code has to be put where a TimeOut is detected
//I use ExecutorService and Future<?> Object

void onTimeOut()
{
    backedSelenuium.runScript("window.stop();");
}
于 2012-12-06T18:11:21.450 回答
2

我遇到了同样的问题,似乎没有通用的解决方案。然而,在他们的错误跟踪系统中有一个关于它的错误,你可以“加星”投票给它。

http://code.google.com/p/selenium/issues/detail?id=687

关于该错误的评论之一有一个可能对您有用的解决方法 - 基本上,它创建一个单独的线程等待所需的时间,然后尝试在浏览器中模拟按转义键,但这需要浏览器窗口位于最前面,这可能是个问题。

http://code.google.com/p/selenium/issues/detail?id=687#c4

于 2011-06-20T08:06:30.877 回答
0

我今天发现的一件奇怪的事情是,一个永远不会停止在我的机器上加载的网站(FF3.6 - 4.0 和 Mac Os 10.6.7)在我机器的 Chrome 以及另一台 Mac Os 和 Windows 中停止正常加载我的一些同事的机器!

我认为这个问题与 Firefox 的 bug 密切相关。有关详细信息,请参阅此博客文章。也许将 FireFox 升级到最新版本会解决您的问题。无论如何,我希望看到模拟“停止”按钮的 Selenium 更新......

于 2012-01-19T18:01:51.127 回答
0

基本上我将浏览器超时设置为低于我的硒集线器,然后捕获错误。然后停止浏览器加载,然后继续测试。

webdriver.manage().timeouts().pageLoadTimeout(55000);

function handleError(err){
          console.log(err.stack);
        };


return webdriver.get(url).then(null,handleError).then(function () {
            return webdriver.executeScript("return window.stop()");
        });

于 2015-06-18T09:22:53.953 回答
0

这是一个非常繁琐的问题要解决。但是,我想知道为什么人们将其复杂化。我刚刚做了以下事情,问题得到了解决(也许最近得到了支持):

driver= webdriver.Firefox()
driver.set_page_load_timeout(5)
driver.get('somewebpage')

它使用Firefox驱动程序(以及Chrome驱动程序)对我有用。

于 2018-11-03T03:55:11.750 回答
0

好吧,以下概念在 Chrome 上与我一起使用,尝试相同:

1) 导航到 "about:blank" 2) 获取元素 "body" 3) 在 elemënt 上,只需 Send Keys Ësc

于 2016-08-24T13:54:02.093 回答
-1

万一其他人可能会遇到同样的永远加载烦恼,您可以使用简单的附加组件,例如Firefox 的 Killspinners轻松完成这项工作。

编辑:如果 javascript 是问题,则此解决方案不起作用。然后您可以使用 Greasemonkey 脚本,例如:

// ==UserScript==
// @name        auto kill
// @namespace   default
// @description auto kill
// @include     *
// @version     1
// @grant       none
// ==/UserScript==

function sleep1() {
  window.stop();
  setTimeout(sleep1, 1500);
}

setTimeout(sleep1, 5000);

于 2016-09-24T08:42:37.647 回答