21

私はPhantomJSヘッドレスブラウザを私のプロジェクトに統合することに取り組んでいます(現在はバージョン1.6を使用しています)。ほとんどの場合、それは私が達成する必要があることを達成する上で素晴らしい仕事をしています。ただし、WebPage.open()呼び出しの非同期性と、ある時点でphantom.exit()を呼び出す必要があるため、クライアント側のリダイレクトがどこに行くのか予測できない場合は、クライアント側のリダイレクトを処理するのが難しくなります。トーゴ。

私が求めているのは、メタリフレッシュ(別のページにつながる)とonloadイベントなどに関連付けられたJavaScriptリダイレクトが実行された後にのみphantom.exit()を呼び出す方法です。理論的には、クライアント側のリダイレクトはページの読み込み後何秒でも発生する可能性があり、リダイレクト発生しなくなったときにのみ終了する機能を要求することはできないため、これが問題である理由がわかります。 。今のところ、私が考えることができる最善の解決策は、a)ページ上のメタリフレッシュ要素の存在を手動で検出し、それらを自分で処理することです。b)setInterval()を使用して、ある程度の時間を確保します(たとえば、1- 1.5秒)phantom.exit()を呼び出す前に経過します。基本的には次のようになります。

var page = require('webpage').create();
var visitComplete = false;
var url = "http://some.url";
var pageOpenedTime;
setInterval(function() {
    if (visitcomplete && typeof pageOpenedTime != 'undefined' &&
        new Date() - pageOpenedTime >= 1500)
    {
        phantom.exit();
    }
), 1000);
page.open(url, function() {
    pageOpenedTime = new Date();
    if (!hasMetaRefresh(page)) {
        visitComplete = true;
    }
});

function hasMetaRefresh(page) {
    // Query the DOM here to detect meta refresh elements
}

より良いアイデアはありますか?

編集:私の最初の考えは、最初のページの読み込みに関連付けられたJavaScriptが実行されたときに発生するPhantomJSイベントがあるかもしれないということでしたが、onLoadFinishedコールバックはページ内のJavaScriptの実行の前に表示されます。 onloadイベント。また、待機する必要のある間隔についていくつかのテストを行いました。小さなテストページでJavaScriptリダイレクト(body onloadイベントを介して)を実行するには1000ミリ秒で十分でしたが、100ミリ秒では十分ではありませんでした。

4

3 に答える 3