PhantomJSの要素をクリックするにはどうすればよいですか?
page.evaluate(function() {
document.getElementById('idButtonSpan').click();
});
これにより、「undefined is a function ...」というエラーが表示されます
私が代わりに
return document.getElementById('idButtonSpan');
そしてそれを印刷し、
次に[オブジェクトオブジェクト]を出力するため、要素は存在します。
この要素はボタンとして機能しますが、実際には送信入力ではなく単なるスパン要素です。
このボタンをクリックしてCasperで動作させることができましたが、Casperには他の制限があったため、PhantomJSに戻りました。
.click()
は標準ではありません。イベントを作成してディスパッチする必要があります。
function click(el){
var ev = document.createEvent("MouseEvent");
ev.initMouseEvent(
"click",
true /* bubble */, true /* cancelable */,
window, null,
0, 0, 0, 0, /* coordinates */
false, false, false, false, /* modifier keys */
0 /*left*/, null
);
el.dispatchEvent(ev);
}
@torazaburoの応答の代わりに、PhantomJSで実行するときにHTMLElement.prototype.click
をスタブできます。たとえば、PhantomJS + QUnitを使用してテストを実行し、qunit-config.js
に次のようなものがあります。
if (window._phantom) {
// Patch since PhantomJS does not implement click() on HTMLElement. In some
// cases we need to execute the native click on an element. However, jQuery's
// $.fn.click() does not dispatch to the native function on <a> elements, so we
// can't use it in our implementations: $el[0].click() to correctly dispatch.
if (!HTMLElement.prototype.click) {
HTMLElement.prototype.click = function() {
var ev = document.createEvent('MouseEvent');
ev.initMouseEvent(
'click',
/*bubble*/true, /*cancelable*/true,
window, null,
0, 0, 0, 0, /*coordinates*/
false, false, false, false, /*modifier keys*/
0/*button=left*/, null
);
this.dispatchEvent(ev);
};
}
}
きれいではありませんが、選択にjQueryを使用できるようにするためにこれを使用しています。
var rect = page.evaluate(function() {
return $('a.whatever')[0].getBoundingClientRect();
});
page.sendEvent('click', rect.left + rect.width / 2, rect.top + rect.height / 2);
ただし、jQueryを使用しない場合は、$(s)[0]
をdocument.querySelector(s)
にいつでも置き換えることができます。
(ビューの心にある要素に依存しています。つまり、viewportSize.heightは十分に大きいです)。
次の方法が役立つことを願っています。それはバージョン1.9で私のために働いた
page.evaluate(function(){
var a = document.getElementById("spr-sign-in-btn-standard");
var e = document.createEvent('MouseEvents');
e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
a.dispatchEvent(e);
waitforload = true;
});
これは私のために働いた。これが他の人にも役立つことを願っています
次のようなevaluate
で簡単なJavaScriptを使用します。
page.evaluate(function() {
document.getElementById('yourId').click();
});
1.9.2
でこれが機能し、クリックハンドラーがトリガーされました。
var a = page.evaluate(function() {
return document.querySelector('a.open');
});
page.sendEvent('click', a.offsetLeft, a.offsetTop);
最も簡単な方法は、jQueryを使用することです。
page.evaluate(function() {
page.includeJs("your_jquery_file.js", function() {
page.evaluate(function() {
$('button[data-control-name="see_more"]').click();
});
});
});
PhantomJSではダブルクリックも可能です。
これは 答え of stovroz から適応され、dblclick
、mousedown
およびmouseup
を含むネイティブclick
をトリガーします。イベント(それぞれ2つ)。
var rect = page.evaluate(function(selector){
return document.querySelector(selector).getBoundingClientRect();
}, selector);
page.sendEvent('doubleclick', rect.left + rect.width / 2, rect.top + rect.height / 2);
次の2つの方法は、dblclick
イベントのみをトリガーし、それに先行する他のイベントはトリガーしません。
this answer of torazaburo からの適応:
page.evaluate(function(selector){
var el = document.querySelector(sel);
var ev = document.createEvent("MouseEvent");
ev.initMouseEvent(
'dblclick',
true /* bubble */, true /* cancelable */,
window, null,
0, 0, 0, 0, /* coordinates */
false, false, false, false, /* modifier keys */
0 /*left*/, null
);
el.dispatchEvent(ev);
}, selector);
この回答 of Jobins John からの適応:
page.evaluate(function(selector){
var el = document.querySelector(sel);
var e = document.createEvent('MouseEvents');
e.initMouseEvent('dblclick', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
el.dispatchEvent(e);
}, selector);
要素を直接クリックすることはできませんでした。代わりに、htmlを見て、onclickで呼び出された関数を見つけ、その関数を呼び出しました。
Document.querySelector(element).click()は、Phantomjs 2.0を使用しているときに機能します
click: function (selector, options, callback) {
var self = this;
var deferred = Q.defer();
options = options || {timeout:1000};
setTimeout(function () {
self.page.evaluate(function(targetSelector) {
$(document).ready(function() {
document.querySelector(targetSelector).click();
}) ;
}, function () {
deferred.resolve();
}, selector);
}, options.timeout);
return deferred.promise.nodeify(callback);
},
JQueryを使用する場合、JQuery UIはこれらをシミュレートするユーティリティを作成しました: jquery-simulate 。これをPhantomJSとChromeで使用します
$ele..simulate( "click" );