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

    Przygotowałem scenariusz do tworzenia webshotów naszej aplikacji. To działa doskonale i wszystko jest w porządku Dopóki nie napotkać obraz ze złamanym URL:timeout strony phantomJS

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

    udało mi się przełamać skrypt po 6 sekund za pomocą poniższego, zanim to właśnie pętli zawsze.

    Ale czy to możliwe, aby zignorować żądanie sieciowe (AKA wziąć obraz z DOM), a następnie przystąpić do tworzenia kciuka bez obrazu (lub z wstrzykiwany obrazu zaginionego obrazu!)

    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

    To jest doskonałe pytanie. Mamy podobny problem, z tym że nieco trudniej go rozwiązać. Mamy stronę klienta, która ma niestandardowy javascript, który jest źle napisany. Wydaje się, że zawiesił się webkit. Mamy ogromny wachlarz stron internetowych, które chcemy przetestować, ale nie działa, jeśli niestandardowy js klienta zrywa z webkitem. Tim obj jest dobrym rozwiązaniem, ale zastanawiam się, czy ktoś ma rozwiązanie diff. ...? – cliffbarnes

    Odpowiedz

    60

    PhantomJS 1.9 wprowadził nowe ustawienie, resourceTimeout, które określa, jak długo żądanie może zostać wykonane, zanim zostanie anulowane. Wraz z tym zdarzeniem jest wywoływane zdarzenie onResourceTimeout, które jest wyzwalane, jeśli/kiedy upłynie limit czasu żądania.

    Oto fragment kodu ilustrujący wszystkie powyższe:

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

    Niestety te opcje są słabo udokumentowane teraz. Musiałem przejść przez GitHub discussions i PhantomJS source code, aby je znaleźć.

    +2

    Czy resourceTimeout ma zakończyć proces phantomjs, który został wywołany. Bo dla mnie tak nie jest. Proces phantomjs po prostu zawiesza się w nieskończoność. – Donato

    +0

    @Donato Myślę, że resourceTimeout generuje tylko pewne zdarzenie, które może być obsługiwane w 'page.onResourceTimeout' – Scadge

    +1

    Przynajmniej w wersji 1.9.8 resourceTimeout przerywa proces - więc plik PDF jest uszkodzony, ale proces się nie zawiesza. Ponadto rejestruję, który zasób spowodował problem, używając strony.onResourceTimeout = funkcja (żądanie) ... – Gerfried

    Powiązane problemy