web-dev-qa-db-fra.com

délai d'expiration de la page Web phantomJS

J'ai mis en place un script pour créer des webshots de notre application. Il fonctionne parfaitement et tout va bien Jusqu'à ce que je rencontre une image avec une URL cassée:

 "<img src='http://testserver.our.intranet/fetch/image/373e8fd2339696e2feeb680b765d626e' />"

J'ai réussi à casser le script après 6 secondes en utilisant ce qui suit, avant qu'il ne soit en boucle pour toujours.

Mais, est-il possible d'ignorer la requête réseau (AKA retirer l'image de DOM) puis de créer le pouce sans l'image, (ou avec une image injectée, image manquante!)

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

if (system.args.length < 3 || system.args.length > 5) {
    phantom.exit(1);
} else {
    address = system.args[1];
    output  = system.args[2];
    page.viewportSize = { width: 640, height: 640 };
    page.zoomFactor = 0.75;
    page.clipRect = { top: 10, left: 0, width: 640, height: 490 };
    try{
        page.open(address, function (status) {
            if (status !== 'success') {
                console.log('Unable to load the address!');
                phantom.exit();
            } else {
                window.setTimeout(function () {
                    page.render(output);
                    phantom.exit();
                }, 200);
            }
        });    
    } finally{
        setTimeout(function() {
            console.log("Max execution time " + Math.round(6000) + " seconds exceeded");
            phantom.exit(1);
        }, 6000);
    }
}
30
Kim Isaksen

PhantomJS 1.9 a introduit un nouveau paramètre, resourceTimeout, qui contrôle le temps qu'une demande peut prendre avant d'être annulée. Parallèlement à cela, il y a un événement onResourceTimeout qui est déclenché si/quand une demande expire.

Voici un extrait de code illustrant tout ce qui précède:

var page = require('webpage').create();  
page.settings.resourceTimeout = 5000; // 5 seconds
page.onResourceTimeout = function(e) {
  console.log(e.errorCode);   // it'll probably be 408 
  console.log(e.errorString); // it'll probably be 'Network timeout on resource'
  console.log(e.url);         // the url whose request timed out
  phantom.exit(1);
};

page.open('http://...', function (status) {
...
}

Malheureusement, ces options sont actuellement mal documentées. J'ai dû passer par GitHub discussions et le code source PhantomJS afin de les découvrir.

62
Michael Benford