私はPhantomJSの新機能ですから、いくつかの実用的な例題にぶつかり合っています。PhantomJSボタンのクリックとフォームの提出
私が試みたことの1つは、偽のPollDaddy投票に投票を提出することでしたが、私は苦労しています。以下のスクリプトを使用して、最初のスクリーンショットから自分のオプションボタンがクリック/選択されていることを知ることができます。しかし、私の答えはなぜ提出されないのですか? 2番目のスクリーンショットは、click
というイベントを2番目のevaluate
のVOTEボタンで実行していても、最初のスクリーンショットと同じに見えます。誰でも知っている理由は?それを動作させる方法を知っていますか?
var webPage = require('webpage');
var page = webPage.create();
//******* BEGIN LOGGING METHODS *******
// http://phantomjs.org/api/webpage/handler/on-url-changed.html
page.onUrlChanged = function(targetUrl) {
console.log('New URL: ' + targetUrl);
};
// http://phantomjs.org/api/webpage/handler/on-console-message.html
page.onConsoleMessage = function(msg, lineNum, sourceId) {
console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
};
// http://phantomjs.org/api/webpage/handler/on-error.html
page.onError = function(msg, trace) {
var msgStack = ['ERROR: ' + msg];
if (trace && trace.length) {
msgStack.push('TRACE:');
trace.forEach(function(t) {
msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : ''));
});
}
console.error(msgStack.join('\n'));
};
// http://phantomjs.org/api/webpage/handler/on-resource-error.html
page.onResourceError = function(resourceError) {
console.log('Unable to load resource (#' + resourceError.id + ' URL:' + resourceError.url + ')');
console.log('Error code: ' + resourceError.errorCode + '. Description: ' + resourceError.errorString);
};
// http://phantomjs.org/api/webpage/handler/on-resource-timeout.html
page.onResourceTimeout = function(request) {
console.log('Response Timeout (#' + request.id + '): ' + JSON.stringify(request));
};
//******* END LOGGING METHODS *******
page.open('https://polldaddy.com/poll/9424638/', function(status) {
console.log('Status: ' + status);
//make selection
var myselection = page.evaluate(function() {
var ev = document.createEvent("MouseEvent");
ev.initMouseEvent("click", true, true, window, null,0, 0, 0, 0, false, false, false, false, 0, null);
//radio button for Curly has id=PDI_answer42988707
var myselection = document.querySelector("#PDI_answer42988707");
(myselection).dispatchEvent(ev);
return document.title;
});
//screen capture the selection
page.render('selection.png');
console.log(myselection);
//click the Vote button
var dovote = page.evaluate(function() {
var ev = document.createEvent("MouseEvent");
ev.initMouseEvent("click", true, true, window, null,0, 0, 0, 0, false, false, false, false, 0, null);
//get a handle to the vote button
var votebutton = document.querySelector("a.vote-button");
//click the vote button
(votebutton).dispatchEvent(ev);
return document.title;
});
//delay, then take screenshot...
setTimeout(
function(){
page.render('voted.png');
console.log(dovote);
}
,2000
);
});
Linux MintのPhantomJS 1.9.0を使用してスクリプトを実行しています。実行パラメータは、任意のSSLハンドシェイクの失敗を克服するために、次のようにされています
phantomjs --ignore-ssl-errors=true --ssl-protocol=any myscript.js
私は、コマンドライン上の--cookies-file
と--local-storage-path
を設定しようとしたが、それはどちらかの助けにはなりませんでした。
私は上記のコンソールロギングのすべてから取得出力はこれです:
New URL: https://polldaddy.com/poll/9424638/ <-- from urlChange
CONSOLE: JQMIGRATE: Logging is active (from line # in "") <-- from onConsoleMessage
Status: success
Who is your favorite Stooge (poll 9424638) | Polldaddy.com
Who is your favorite Stooge (poll 9424638) | Polldaddy.com
私の役に立たない世論調査はここにある:https://polldaddy.com/poll/9424638/、とあなたは私が結果をスタックしようとしているというのが私のスクリプトから表示されますカーリーのために。
v1.9.0を使用している理由は何ですか?それは古代です。 2.1.1、1.9.8、1.9.7の順に試してください。 –
ありがとう、@ArtjomB。私はMintのSynapticパッケージマネージャーのものを使用していました。しかし、2.1.1(ダウンロードサイトの最新版)に手動でアップグレードしただけですが、問題は残ります。他のアイデア? – Marc
onConsoleMessage、onError、onResourceTimeoutイベントに登録してください([Example](https://gist.github.com/artjomb/4cf43d16ce50d8674fdf#file-1_phantomerrors-js))。多分エラーがあるかもしれません。 –