web-dev-qa-db-ja.com

PhantomJS;要素をクリックします

PhantomJSの要素をクリックするにはどうすればよいですか?

page.evaluate(function() {
    document.getElementById('idButtonSpan').click();  
});

これにより、「undefined is a function ...」というエラーが表示されます

私が代わりに

 return document.getElementById('idButtonSpan');

そしてそれを印刷し、

次に[オブジェクトオブジェクト]を出力するため、要素は存在します。

この要素はボタンとして機能しますが、実際には送信入力ではなく単なるスパン要素です。

このボタンをクリックしてCasperで動作させることができましたが、Casperには他の制限があったため、PhantomJSに戻りました。

80
user984003

.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);
}
66
user663031

@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);
    };
  }
}
34
TheCloudlessSky

きれいではありませんが、選択に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は十分に大きいです)。

15
stovroz

次の方法が役立つことを願っています。それはバージョン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;
});

これは私のために働いた。これが他の人にも役立つことを願っています

10
Jobins John

次のようなevaluateで簡単なJavaScriptを使用します。

page.evaluate(function() {
    document.getElementById('yourId').click();
});
6
HappyCoder888

1.9.2でこれが機能し、クリックハンドラーがトリガーされました。

var a = page.evaluate(function() {
    return document.querySelector('a.open');
});

page.sendEvent('click', a.offsetLeft, a.offsetTop);
6
sshaw

最も簡単な方法は、jQueryを使用することです。

page.evaluate(function() {
  page.includeJs("your_jquery_file.js", function() {
    page.evaluate(function() {
      $('button[data-control-name="see_more"]').click();
    });
  });
});
2
Jiayuan Zhang

PhantomJSではダブルクリックも可能です。

お勧め

これは 答え of stovroz から適応され、dblclickmousedownおよび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);

フルテストスクリプト

2
Artjom B.

要素を直接クリックすることはできませんでした。代わりに、htmlを見て、onclickで呼び出された関数を見つけ、その関数を呼び出しました。

2
user984003

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);
},
2
GracefulCode

JQueryを使用する場合、JQuery UIはこれらをシミュレートするユーティリティを作成しました: jquery-simulate 。これをPhantomJSとChromeで使用します

$ele..simulate( "click" );
0
wbdarby