0

phantomjs (Windows ではバージョン 1.9.1) を使用して、いくつかの QUnit テスト URL にアクセスしようとしています。企業サイトのプロキシの背後にいますが、アクセスしようとしている URL はローカルの開発ワークステーションから提供されています。さらに、他の 2 つのブラウザー (Hv3 と Dooble) を使用して同じ URL にアクセスしようとしましたが、必要なプロキシ設定、および QUnit JavaScript を実行できない場合でも、HTML 応答を取得します。

そのため、生の HTML を取得するために javascriptEnabled 設定 (さらにいくつかの設定、以下のコードを参照) を false に調整してみましたが、役に立ちませんでした。page.open への呼び出しを try/catch でラップしましたが、明らかにこれは例外によるものではありません。むしろ、最後の phantom.exit() ステートメントが実行される直前の console.log ステートメントです。

さらに、page.onResourceRequested、page.onError、page.onResourceReceived からのロギングを含むhttps://github.com/ariya/phantomjs/wiki/Network-Monitoringの推奨に従っており、onResourceReceived のコールバックのみが実行されます。そして、 --proxy-type=none コマンドライン引数を指定していますが、すべて役に立ちません。

以下のコードと出力、よろしくお願いします。私は途方に暮れています。多分それはphantomjsの問題ですか?ただし、報告する前にすべてを除外したいだけです。

コード:

var page = require('webpage').create();

page.onResourceRequested = function (request) {
    console.log('Request ' + JSON.stringify(request, undefined, 4));
};

page.onResourceReceived = function (response) {
    console.log('Receive ' + JSON.stringify(response, undefined, 4));
};

page.onError = function (msg, trace) {
    console.log(msg);
    trace.forEach(function(item) {
        console.log('  ', item.file, ':', item.line);
    })
}

page.settings.webSecurityEnabled = false;
page.settings.localToRemoteUrlAccessEnabled = true;
//page.settings.javascriptEnabled = false;

for (var setting in page.settings) {
    console.log(setting + ": " + page.settings[setting]);
}

try {
    page.open('http://local.example.com:9001/test/workflow', function() {
        console.log('page opened');
    });
}
catch(xcep) {
    console.log(xcep);
}

console.log('before exit');
phantom.exit();

出力:

XSSAuditingEnabled: false
javascriptCanCloseWindows: true
javascriptCanOpenWindows: true
javascriptEnabled: true
loadImages: true
localToRemoteUrlAccessEnabled: true
userAgent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.1 Safari/534.34
webSecurityEnabled: false
Request {
    "headers": [
        {
            "name": "User-Agent",
            "value": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.1 Safari/534.34"
        },
        {
            "name": "Accept",
            "value": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        }
    ],
    "id": 1,
    "method": "GET",
    "time": "2013-07-12T09:49:58.262Z",
    "url": "http://local.example.com:9001/test/workflow"
}
before exit
4

2 に答える 2

1

ここで自分をそのような骨の折れる人間であると償おうとして、page.open へのコールバックを忘れて非同期で実行します。私が受け入れた回答へのコメントで述べたように、実際にはループで実行する必要があるため、そのコールバック内から phantom.exit() を呼び出すのは嫌でした。

これは、phantom.exit() が常に呼び出されるようにするための try/catch の使用を含む、クロージャーでそれを行う方法です。

注:宣言するのではなく

page = require('webpage').create()

上部では、単に webpage モジュールへの参照を作成し、ループの反復ごとに webpage.create() をクロージャーに渡します。

コード:

var fs = require('fs'),
    webpage = require('webpage');

var publicJsDir = [fs.workingDirectory, '..', 'public', 'js'].join(fs.separator),
    testNames = fs.list(publicJsDir).map(function(file){
        return (file.match(/^(.*)\.test\.js$/) || [])[1];
    }).filter(function(val) {return val});

for (var i=testNames.length; i--; ) {
    (function(i, testName, page){
        try {
            console.log(testName); //page.open(...
            if (!i) phantom.exit();
        }
        catch(xcep) {
            console.log(xcep);
            phantom.exit();
        }
    })(i, testNames[i], webpage.create());
}

出力:

workflow
workflow.cloning
utils.trains
utils.stations
models.trains.processors
models.stations
gis
fp
flow
ds
于 2013-07-12T16:34:50.307 に答える