var system = require("system");
var page;
// user supplied url
var myurl = system.args[1];
// var myurl = 'https://waffles.ch/';
page = require('webpage').create();
// suppress errors from output
page.onError = function(msg, trace) {};
// 5 seconds
page.settings.resourceTimeout = 5000;
// page.settings.javascriptEnabled = false;
page.open(myurl, function(status) {
//hack for page.open not hooking into phantom.onError
setTimeout(function() {
if (status !== "success") {
console.log(myurl);
phantom.exit();
throw new Error("Unable to access network");
} else {
var pageTitle = myurl.replace(/http.*\/\//g, "").replace("www.", "").split("/")[0];
var filePath = "img/" + pageTitle + '.jpg';
page.render(filePath, {format: 'jpeg', quality: '75'});
console.log(filePath);
phantom.exit();
}
}, 0);
});
上記のコードを使用すると、ほとんどのWebページで正常に動作します。 URL "https://waffles.ch/"を持つコンソールまたはWebアプリケーションを介してスクリプトを実行すると、それは無限にpage.open(私は信じて)にハングアップします。ページが開いているときにファントムを終了する方法(例)
このURLには、実行を停止しない飛行機(画面上を飛行する飛行機)がいくつか含まれていて、ファンタムがロックアップする原因が考えられます。これは既知のバグですか?
JSは、page.settings.javascriptEnabled = false;
でスイッチをオフにすると、ページのスクリーンショットが問題なくレンダリングされるため、JSがハングする原因になります。
明らかに私は2つの質問があるので、明らかにスクリーンショットを撮るためにjavascriptをオフにすることはできません(page.evaluate、redirectsなど)。
1.)JavaScriptをオフにすることなくwaffles.ch
のようなアニメーションを含むウェブページのスクリーンショットをレンダリングする方法はありますか?
2)Webページがどのように私はファントムを終了することができ、おそらくも?? errrorを返すpage.open
に、ハングアップした場合)
すべてのヘルプ/アドバイスをいただければ幸いです。
ファントムバージョン:2.1.1 OS:Windows 7 64ビット。 waitfor()
機能を使用して、私は。試してみました(それでも上記URLでハング)しました
他の事
のtry/catchで
var system = require("system");
var page;
// user supplied url
var myurl = system.args[1];
var page = require('webpage').create();
page.open(myurl, function (status) {
try {
if (status !== "success") {
console.log("Unable to access network");
phantom.exit();
} else {
//do some stuff with the DOM
var pageTitle = myurl.replace(/http.*\/\//g, "").replace("www.", "").split("/")[0];
var filePath = "img/" + pageTitle + '.jpg';
page.render(filePath, {format: 'jpeg', quality: '75'});
console.log(filePath);
phantom.exit();
}
} catch (ex) {
var fullMessage = "\nJAVASCRIPT EXCEPTION";
fullMessage += "\nMESSAGE: " + ex.toString();
for (var p in ex) {
fullMessage += "\n" + p.toUpperCase() + ": " + ex[p];
}
console.log(fullMessage);
}
});
// ******************************
。 https://github.com/ariya/phantomjs/blob/master/examples/waitfor.js
var system = require("system");
var page;
// user supplied url
var myurl = system.args[1];
var page = require('webpage').create();
// suppress errors from output
page.onError = function(msg, trace) {
console.log("Error occurred" + msg);
phantom.exit();
};
// 5 seconds
page.settings.resourceTimeout = 5000;
page.open(myurl, function (status) {
// Check for page load success
if (status !== "success") {
console.log("Unable to access network");
phantom.exit();
} else {
waitFor(function() {
// Check in the page if a specific element is now visible
return page.evaluate(function() {
return $("body").is(":visible");
});
}, function() {
console.log("body is visible");
phantom.exit();
});
}
});
ウォッチドッグタイマーを設定すると、タイムアウトが許可されていればタグ付きメッセージを 'console.log'に出力できます。ランナーコンテキストのメッセージを、 'phantom.exit()'ステートメントを発行できる 'onConsoleMessage'リスナーで解析することができます。 –
あなたは私が今までに見たonErrorコールバックを奇妙に使用しています。エラーを無視するだけです。エラーを監視し、その出力を抑止する必要はありません。 – Vaviloff
@Cool Blue、以前はウォッチドッグタイマーについて聞いたことがありません。このスクリプトはあなたの提案を達成するでしょうか? https://github.com/GCheung55/watchout –