2016-05-22 6 views
1

私は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/、とあなたは私が結果をスタックしようとしているというのが私のスクリプトから表示されますカーリーのために。

+0

v1.9.0を使用している理由は何ですか?それは古代です。 2.1.1、1.9.8、1.9.7の順に試してください。 –

+0

ありがとう、@ArtjomB。私はMintのSynapticパッケージマネージャーのものを使用していました。しかし、2.1.1(ダウンロードサイトの最新版)に手動でアップグレードしただけですが、問題は残ります。他のアイデア? – Marc

+0

onConsoleMessage、onError、onResourceTimeoutイベントに登録してください([Example](https://gist.github.com/artjomb/4cf43d16ce50d8674fdf#file-1_phantomerrors-js))。多分エラーがあるかもしれません。 –

答えて

0

あなたはpolldaddyページに含まれているJavaScriptのを見れば、あなたは次のチェックに投票機能を見つけることができます:

if (event.pageX) { 
    eventX = event.pageX; 
    eventY = event.pageY; 
} else { 
    eventX = event.clientX; 
    eventY = event.clientY; 
} 

... 

if (eventX == 0 && eventY == 0) { 
    return false 
} 

は基本的に、彼らはイベントの場所と短絡を見ていますxとyの位置が両方とも0に等しい場合。

作成するマウスイベントを変更して、clientXまたはclientYの値が0でない場合は、スクリプトが機能するはずです。

関連する問題