我试图在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()
是我真正需要的东西,因为我想在某些情况下终止我的脚本(例如,尝试访问特定域)。
我觉得我的问题太明显了,但不知道发生了什么。
答案 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();
};
也会奏效。如果确实如此,那么您只需要使用其中一种解决方法,直到发布可靠的补丁或下一个版本,并修复错误。