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

    私は私たちのアプリのwebshotsを作成するためのスクリプトを設定しました。 それは完璧に動作し、私は壊れたURLを持つ画像に遭遇するまで、すべての罰金です:私はそれだけで永遠にループした前に、以下の使用して6秒後にスクリプトを壊すために管理しているphantomJSのウェブページのタイムアウト

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

    しかし、それは(AKADOMのうち、画像を撮る)ネットワーク要求を無視し、その後、画像なしで親指を作成するために進めることが可能である(または注入された画像不足しているイメージで!)

    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

    これは素晴らしい質問です。私たちは同様の問題を抱えていますが、解決するのが少し難しいという点が異なります。我々は、あまり書き込まれていないカスタムJavaScriptを持っているクライアントのWebサイトを持っています。 Webkitがハングしているようです。私たちはテストしたい巨大なWebサイトを持っていますが、クライアントのカスタムjがWebkitを壊している場合は機能しません。タイマobjは良い解決策ですが、誰かが差分解決策を持っているのだろうかと思います。 ...? – cliffbarnes

    答えて

    60

    PhantomJS 1.9では、新しい設定、resourceTimeoutが導入されました。この設定では、要求が取り消されるまでにかかる時間を制御します。それに加えて、要求がタイムアウトしたときにトリガーされるonResourceTimeoutイベントがあります。ここで

    は、上記のすべてを示すコードスニペットです:

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

    は、残念ながら、それらのオプションはほとんど今記載されています。私はそれらを見つけるためにGitHub discussionsPhantomJS source codeを通過しなければならなかった。

    +2

    resourceTimeoutは、呼び出されたphantomjsプロセスを終了させることになっています。私のために、それはしないので。 phantomjsプロセスは無期限にハングアップします。 – Donato

    +0

    @Donato私はresourceTimeoutが 'page.onResourceTimeout'で処理できるイベントしか生成しないと思います。 – Scadge

    +1

    少なくともバージョン1.9.8ではresourceTimeoutがプロセスを中断します。そのため、PDFは破損していますが、プロセスはハングしません。私はまたどのリソースがpage.onResourceTimeout = function(request)を使って問題を引き起こしたかを記録します... – Gerfried

    関連する問題