PhantomJS; 点击一个元素

如何点击PhantomJS中的元素?

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

这给我一个错误“未定义不是一个函数…”

如果我改为

  return document.getElementById('idButtonSpan'); 

然后打印它,

然后它打印[object object],所以元素确实存在。

该元素作为一个button,但它实际上只是一个span元素,而不是提交input。

我能够点击这个button来与Casper一起工作,但是Casper有其他限制,所以我回到了PhantomJS。

.click()不是标准的。 您需要创build一个事件并发送它:

 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来运行我们的testing,在我们的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进行select:

 var rect = page.evaluate(function() { return $('a.whatever')[0].getBoundingClientRect(); }); page.sendEvent('click', rect.left + rect.width / 2, rect.top + rect.height / 2); 

但是如果不使用jQuery,你总是可以用document.querySelector(s)replace$(s)[0]

(它确实依赖于在视图中的元素,即您的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; }); 

这对我有效。 希望这对其他人也有用

1.9.2这个工作对我来说,点击处理程序被触发:

 var a = page.evaluate(function() { return document.querySelector('a.open'); }); page.sendEvent('click', a.offsetLeft, a.offsetTop); 

使用简单的JavaScript与evaluate ,如下所示:

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

我从来没有能够直接点击元素。 相反,我查看了html,find了用onclick调用的函数,然后调用了这个函数。

使用Phantomjs 2.0时,Document.querySelector(element).click()可以工作

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

PhantomJS也可以双击。

推荐的

这是从stovroz 的答案改编,并触发本地dblclick包括mousedownmouseupclick事件(每个两个)。

 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); 

其他方法

以下两种方法只触发dblclick事件,而不触发其他事件。

改编自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); 

改编自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); 

完整的testing脚本

最简单的方法是使用jQuery。

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

对于那些使用JQuery,JQuery UI创build了一个实用程序来模拟这些: jquery-simulate 。 我在PhantomJS和Chrome中使用它

 $ele..simulate( "click" );