PhantomJS在Linux上的phantom.exit()之后崩溃

时间:2013-10-02 18:54:36

标签: javascript phantomjs

我试图在PhantomJS之上构建一个非常简单的解决方案,但在调用phantom.exit()时它会以某种方式崩溃。例如,运行以下代码时:

var page = require('webpage').create();
page.onResourceRequested = function (request) {
    console.log('Request ' + request.url);
    phantom.exit();
};
page.open('http://www.google.com/');

在Ubuntu(12.04.3 LTS)和CentOS(6.4)上出现分段错误。如果我注释掉phantom.exit()它会列出请求的网址,那么它基本上会按预期工作。但是phantom.exit()是我真正需要的东西,因为我想在某些情况下终止我的脚本(例如,尝试访问特定域)。 我觉得我的问题太明显了,但不知道发生了什么。

1 个答案:

答案 0 :(得分:7)

这是a known issue,但有一个简单的解决方法。不过,这是一个应该修复的错误,但是现在:

setTimeout(function()
{
    phantom.exit(0);
},0);

这很愚蠢,但这应该可以解决问题......我在链接的github页面上也有一个补丁。还有一些关于为什么会出现这种错误的细节 我认为问题在于:

  

是的,你是对的[phantom.exit应该终止PhantomJS而不执行任何进一步的代码。],但每次调用m_pages [i] - > close();调用deleteLater()这意味着每个对象都将被删除,但异步......也许这就是问题所在。

异步删除在我看来可能是导致错误的原因,因为处理程序在setTimeout之后返回,并且实际的exit调用被延迟,所有内容都可以删除它应该在何时何地删除是。超时有效地将exit调用移到处理程序范围之外...
我没有测试过,但如果是这样的话,可能还是:

var closeFunc = function()
{
    phantom.exit(0);
};
page.onResourceRequested = function (request)
{
    console.log('Request ' + request.url);
    return closeFunc();
};

也会奏效。如果确实如此,那么您只需要使用其中一种解决方法,直到发布可靠的补丁或下一个版本,并修复错误。