Windows で複数のヘッドレス ブラウザーを (同時に) 使用して Web 自動化テストを行う方法はありますか?
できれば、JavaScript を完全にサポートするブラウザーを自動化する必要があるため、webkit が実装された最新の Qt バックエンドが理想的です。
SpynnerとGhost.pyは有望に見えましたが、「複数のブラウザー」セットアップ用の X11 環境しかサポートしていません。
何か案は?
http://dalekjs.com/ はどうですか?
昨年、これを両方の言語で動作させることができました...
zombie
ノードとGhost.py
pythonに使用しました。
Qt webkit バックエンドは、複数のサンドボックス化されたブラウザーを同時に実行できるようにするブラウザー オブジェクトで「タブ」をサポートするようになりました。単一の Webkit モデル間で共有インスタンスを壊し、一度に複数のインスタンスを作成できないようにする機能強化もあったと思います。
ノードでは、オブジェクト プールを使用してローテーションする独立したブラウザを一度に 60 以上使用しましたが、Python では 20 ~ 30 個しか必要としませんでした。しかし、それも完璧に機能しました。
https://github.com/sgentle/phantomjs-nodeを見る_ !」
さらに、 https://groups.google.com/forum/#!msg/phantomjs/Uj5SV6o214w/chFBUnw3vxQJは、1 つの Phantom.js スレッドで複数の「ページ要求」を実行することについても言及しています。また、 http://daker.me/2013/07/testing-your-responsive-design-with-phantomjs.htmlは、Async ライブラリでこれを実装する方法を示しています。
次のコードで動作するようになりました。
var phantom = require('phantom');
var async = require('async');
var pagesToCall = [
['http://www.google.com', 8000],
['http://www.allthingsd.com', 8001],
['http://www.wired.com', 8002],
['http://www.mashable.com', 8003],
['http://www.stackoverflow.com', 8004]
];
function callPage(pageToCall) {
console.log(new Date().getTime() + ': Started page ' + pageToCall[0]);
console.log(new Date().getTime() + ': port:' + pageToCall[1]);
phantom.create({port: pageToCall[1]}, function(ph) {
ph.createPage(function(page) {
page.open(pageToCall[0], function(status) {
console.log(new Date().getTime() + ': Opened page? %s', status);
page.set('viewportSize', {
width: 1280,
height: 800
});
page.set('settings.userAgent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1');
var filename = pageToCall[0].replace('http:\/\/', '') + '.png';
page.render('./screenshots/' + filename, function() {
console.log(new Date().getTime() + ': Wrote page ' + pageToCall[0]);
page.close();
ph.exit();
});
});
});
});
}
//Main
async.each(pagesToCall, callPage, function (e) {
if (e) console.log(e);
});
これはクイックハックです。これはもう少し時間をかければもっとうまく実装できると確信しています。pagesToCall 配列は、呼び出される Web サイトの URL と、PhantomJS との通信ソケットのポート番号の 2 つの引数を取ります。
私が使用した NodeJS モジュールは次のとおりです。