Déboguer PhantomJS: Page Load Fails

phantomjs

PhantomJS est un super outil pour automatiser des tâches et pour faire du test de sites.

Je l’utilise quotidiennement pour analyser le contenu de mes pages et pour réaliser des captures d’écran de sites web.

Simple d’utilisation, vous pouvez coder vos propres scripts JavaScript afin d’automatiser des opérations avec PhantomJS.

PhantomJS propose la commande page.open() qui permet d’émuler un navigateur (browser) qui visiterait une page web.

Malheureusement l’api de PhantomJS ne permet pas de déterminer la raison d’un échec de chargement d’une page.

Les callbacks de PhantomJS vous nous permettre de déboguer et diagnostiquer une erreur de type “Page Load Fails” qui se produit après l’utilisation de la fonction page.open().

PhantomJS et site en HTTPS

Si la page que vous souhaitez ouvrir dans PhantomJS est sur un site HTTPS, il faut absolument lancer votre script avec la commande suivante:

phantomjs --ignore-ssl-errors=true customscript.js

En effet, l’attribut –ignore-ssl-errors=true permet de ne pas prendre en compte les erreurs liées au certificat SSL du site HTTPS.

Déboguer avec les callbacks de PhantomJS

Voici une fonction géniale qui permet d’affecter des callbacks à un objet page, afin de comprendre pourquoi le load à fail:

function trace(page, onlyResErr) {
    if (onlyResErr) {
        page.onResourceError = function(resourceError) {
            page.reason = resourceError.errorString;
            page.reason_url = resourceError.url;
        };
    } else {
        page.onResourceRequested = function(request) {
            system.stderr.writeLine('= onResourceRequested()');
            system.stderr.writeLine('  request: ' + JSON.stringify(request, undefined, 4));
        };
        page.onResourceReceived = function(response) {
            system.stderr.writeLine('= onResourceReceived()');
            system.stderr.writeLine('  id: ' + response.id + ', stage: "' + response.stage + '", response: ' + JSON.stringify(response));
        };
        page.onLoadStarted = function() {
            system.stderr.writeLine('= onLoadStarted()');
            var currentUrl = page.evaluate(function() {
                return window.location.href;
            });
            system.stderr.writeLine('  leaving url: ' + currentUrl);
        };
        page.onLoadFinished = function(status) {
            system.stderr.writeLine('= onLoadFinished()');
            system.stderr.writeLine('  status: ' + status);
        };
        page.onNavigationRequested = function(url, type, willNavigate, main) {
            system.stderr.writeLine('= onNavigationRequested');
            system.stderr.writeLine('  destination_url: ' + url);
            system.stderr.writeLine('  type (cause): ' + type);
            system.stderr.writeLine('  will navigate: ' + willNavigate);
            system.stderr.writeLine('  from page\'s main frame: ' + main);
        };
        page.onResourceError = function(resourceError) {
            system.stderr.writeLine('= onResourceError()');
            system.stderr.writeLine('  - unable to load url: "' + resourceError.url + '"');
            system.stderr.writeLine('  - error code: ' + resourceError.errorCode + ', description: ' + resourceError.errorString);
        };
        page.onError = function(msg, trace) {
            system.stderr.writeLine('= onError()');
            var msgStack = ['  ERROR: ' + msg];
            if (trace) {
                msgStack.push('  TRACE:');
                trace.forEach(function(t) {
                    msgStack.push('    -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function+'")' : ''));
                });
            }
            system.stderr.writeLine(msgStack.join('\n'));
        };
    }
}

Et pour utiliser la fonction, il ne vous reste plus qu’à appeler la fonction trace:

var system = require('system');
var page = require('webpage').create();
trace(page, true);
page.open("http://www.votresite.com/votrepage.html",
function(status) {
if (status !== 'success') {
console.log("Probleme de chargement: url \"" + page.reason_url + "\": " + page.reason);
phantom.exit(1);
} else {
console.log("Chargement réussi");
phantom.exit(0);
}
}
);

Normalement, les messages affichés dans la console sont assez explicites pour vous donner la raison du FAIL sur le chargement de la page.

Leave a Reply

Your email address will not be published. Required fields are marked *