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包括mousedown
, mouseup
和click
事件(每个两个)。
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" );