当PhantomJS获取资源错误时,我可以获取失败的请求id吗?

当PhantomJS获取资源错误时,我可以获取失败的请求id吗?,phantomjs,Phantomjs,我不太明白为什么PhantomJS只返回回调请求的url,而对于另一个,它返回请求id。如果对同一url有多个请求,那么“查找实际失败的请求”就不可能了。有人知道如何获取失败的请求id吗?为什么您真的需要请求id 由于在1.9中添加了onResourceError,因此可能缺少一些信息 解决问题的一种方法是将所有请求的资源都保存在一个数组中,如示例所示。 下面是一个非常基本的实现: var page = require('webpage').create(), system = requ

我不太明白为什么PhantomJS只返回回调请求的url,而对于另一个,它返回请求id。如果对同一url有多个请求,那么“查找实际失败的请求”就不可能了。有人知道如何获取失败的请求id吗?

为什么您真的需要请求id

由于在1.9中添加了
onResourceError
,因此可能缺少一些信息

解决问题的一种方法是将所有请求的资源都保存在一个数组中,如示例所示。 下面是一个非常基本的实现:

var page = require('webpage').create(),
    system = require('system');


if (system.args.length === 1) {
    console.log('Usage: netsniff.js <some URL>');
    phantom.exit(1);
} else {

    page.address = system.args[1];
    page.resources = [];

    page.onLoadStarted = function () {
        page.startTime = new Date();
    };

    page.onResourceRequested = function (req) {
        page.resources[req.id] = {
            request: req,
            startReply: null,
            endReply: null
        };
    };

    page.onResourceReceived = function (res) {
        if (res.stage === 'start') {
            page.resources[res.id].startReply = res;
        }
        if (res.stage === 'end') {
            page.resources[res.id].endReply = res;
        }
    };

    page.onResourceError = function(resourceError) {
    console.log('Unable to load resource (URL:' + resourceError.url + ')');
    console.log('Error code: ' + resourceError.errorCode + '. Description: ' + resourceError.errorString);

    page.resources.forEach(function (resource) {
    var request = resource.request,
            endReply = resource.endReply;

        if (request && request.url === resourceError.url && !endReply) {
            console.log('request id was :' + request.id);
        }
    })

};


    page.open(page.address, function (status) {
        var har;
        if (status !== 'success') {
            console.log('FAIL to load the address');
            phantom.exit(1);
        } else {
            page.endTime = new Date();
            page.title = page.evaluate(function () {
                return document.title;
            });
            console.log(page.title);
            phantom.exit();
        }
    });
}
var page=require('webpage')。create(),
系统=要求(“系统”);
if(system.args.length==1){
log('Usage:netsniff.js');
幻影。出口(1);
}否则{
page.address=system.args[1];
page.resources=[];
page.onLoadStarted=函数(){
page.startTime=新日期();
};
page.onResourceRequested=功能(请求){
页面资源[请求id]={
请求:req,
startReply:null,
endReply:null
};
};
page.onResourceReceived=函数(res){
如果(res.stage==='start'){
page.resources[res.id].startReply=res;
}
如果(res.stage==='end'){
page.resources[res.id].endReply=res;
}
};
page.onResourceError=函数(resourceError){
console.log('无法加载资源(URL:'+resourceError.URL+'));
console.log('错误代码:'+resourceError.errorCode+'。说明:'+resourceError.errorString);
page.resources.forEach(函数(资源){
var request=resource.request,
endReply=resource.endReply;
if(request&&request.url==resourceError.url&&!endReply){
log('请求id为:'+请求id);
}
})
};
第页打开(第页地址、功能(状态){
瓦尔哈尔;
如果(状态!=“成功”){
console.log('加载地址失败');
幻影。出口(1);
}否则{
page.endTime=新日期();
page.title=page.evaluate(函数(){
返回文件.title;
});
控制台日志(页面标题);
phantom.exit();
}
});
}

onResourceError
,您只需要找到与错误资源url匹配的第一个/最后一个/所有记录的url。

实际上,这只是旧文档
onResourceError
具有失败请求的id

page.onResourceError = function(resourceError) {
    console.log('Unable to load resource (request ID:' + resourceError.id + 'URL:' + resourceError.url + ')');
    console.log('Error code: ' + resourceError.errorCode + '. Description: ' + resourceError.errorString);

};

是的,我已经在用同样的方法记录所有请求及其id。但我的问题是可能有多个请求指向同一url,有些有错误,有些没有。在这种情况下,很难判断哪一个失败了。真的吗?我刚刚试过,似乎没有得到id。你使用的是哪个版本的PhantomJs?我正在使用1.9.0。尝试使用1.9.1,现在可以获取id!棒极了。谢谢