如何以编程方式停止在Firefox中加载页面?

时间:2011-03-28 00:10:24

标签: firefox selenium web-crawler ghostdriver

我正在使用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:最后,上述方法均无效。我最终“杀死”了很长时间才完成的线程。我计划尝试使用PhantomJS作为后端的Ghostdriver远程WebDriver。 PhantomJS是一个无头的WebKit脚本,所以我希望不会出现像Firefox这样的真正浏览器的问题。对于没有义务使用firefox(爬行目的)的人,我将更新结果

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

8 个答案:

答案 0 :(得分:6)

我能够绕过这个做一些事情。

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

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

其次,在进行get时,将其包装在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之前停止加载

答案 1 :(得分:2)

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

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

关于该bug的一个评论有一个可能适合你的解决方法 - 基本上,它创建一个单独的线程,等待所需的时间,然后尝试在浏览器中模拟按下转义,但这需要浏览器窗口最重要的,这可能是一个问题。

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

答案 2 :(得分: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();");
}

答案 3 :(得分:0)

  

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

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

答案 4 :(得分:0)

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

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()");
        });

答案 5 :(得分:0)

嗯,以下概念在Chrome上与我合作,尝试相同:

1)导航到“about:blank” 2)得到元素“身体” 3)关于elemënt,只需发送密钥Ësc

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:-1)

如果其他人可能会遇到同样的永久加载烦恼,您可以使用简单的附加组件(例如Killspinners for Firefox)轻松完成工作。

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

&#13;
&#13;
// ==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);
&#13;
&#13;
&#13;