2

I don't quite understand why PhantomJS only returns the url of request for onResourceError callback, while for the other two resource callbacks it returns the request id. That makes "finding which request did actually fail" really impossible if there is more than one request to the same url. Does anyone knows how to get the failed request id?

4

2 回答 2

2

Actually, that's just old documentation. onResourceError has the id of a failed request.

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);

};
于 2013-07-12T12:04:34.683 回答
1

Why do you really need to request id ?

Since onResourceError was added in 1.9, some information may be missing.

A way to resolve your problem is to keep in an array all requested resourcessuach as in netsniff example. Here is a very basic implementation :

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

onResourceError, you just need to find first/last/all recorded urls that match the error resource url.

于 2013-07-11T06:57:55.257 回答