phantomjs
  • webpage-rendering
  • 2013-05-31 9 views 29 likes 
    29

    Ich habe ein Skript eingerichtet, um Webshots unserer App zu erstellen. Es läuft perfekt und alles ist in Ordnung, bis ich ein Bild mit einem gebrochenen url begegnen:phantomJS Webseite Timeout

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

    ich es geschafft haben, das Skript nach 6 Sekunden zu brechen die unter Verwendung Bevor es nur immer Looping wurde.

    Aber ist es möglich, die Netzwerkanforderung (AKA nehmen Sie das Bild aus DOM) zu ignorieren und dann fahren Sie mit dem Daumen ohne das Bild zu erzeugen, (oder mit einem injizierten Bild fehlt Bild!)

    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); 
        } 
    } 
    
    +0

    Dies ist eine ausgezeichnete Frage. Wir haben ein ähnliches Problem, außer dass es ein bisschen schwieriger zu lösen ist. Wir haben eine Website des Kunden, die benutzerdefiniertes Javascript hat, das schlecht geschrieben ist. Es scheint zu verursachen Webkit zu hängen. Wir haben eine riesige Auswahl an Websites, die wir testen wollen, aber es funktioniert nicht, wenn die benutzerdefinierte js eines Kunden webkit bricht. Der Timer Obj ist eine gute Lösung, aber ich frage mich, ob jemand eine Diff-Lösung hat. ...? – cliffbarnes

    Antwort

    60

    PhantomJS 1.9 hat eine neue Einstellung resourceTimeout eingeführt, die steuert, wie lange eine Anforderung dauern kann, bevor sie abgebrochen wird. Zusammen mit dem gibt es ein onResourceTimeout Ereignis, das ausgelöst wird, wenn eine Anforderung eine Zeitüberschreitung aufweist.

    Hier ist ein Code-Snippet alle oben darstellt:

    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) { 
    ... 
    } 
    

    Leider diese Optionen schlecht jetzt dokumentiert. Ich musste GitHub discussions und die PhantomJS source code durchgehen, um sie herauszufinden.

    +2

    Soll resourceTimeout den phantomjs-Prozess beenden, der aufgerufen wurde. Weil es für mich nicht so ist. Der Phantomjs-Prozess hängt einfach auf unbestimmte Zeit. – Donato

    +0

    @Donato Ich denke, ResourceTimeout generiert nur einige Ereignisse, die in 'page.onResourceTimeout' behandelt werden können. – Scadge

    +1

    Mindestens in Version 1.9.8 ResourceTimeout unterbricht den Prozess - so ist die PDF beschädigt, aber der Prozess nicht hängen. Ich protokolliere auch, welche Ressource das Problem verursacht hat, indem ich page.onResourceTimeout = function (request) verwendete ... – Gerfried

     Verwandte Themen

    • Keine verwandten Themen^_^