如何点击PhantomJS中的元素?
page.evaluate(function() {
document.getElementById('idButtonSpan').click();
});
这给了我一个错误“未定义不是函数......”
如果我改为
return document.getElementById('idButtonSpan');
然后打印,
然后打印[object object],因此该元素确实存在。
元素充当按钮,但它实际上只是一个span元素,而不是提交输入。
我能够点击此按钮与Casper合作,但Casper还有其他限制,所以我回到了PhantomJS。
答案 0 :(得分:66)
.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);
}
答案 1 :(得分:34)
在@ 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);
};
}
}
答案 2 :(得分:15)
它不漂亮,但我一直用它来允许我使用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足够大)。
答案 3 :(得分:10)
希望以下方法有用。它在版本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;
});
这对我有用。希望这对其他人也有用
答案 4 :(得分:6)
使用1.9.2
这对我有效,点击处理程序被触发:
var a = page.evaluate(function() {
return document.querySelector('a.open');
});
page.sendEvent('click', a.offsetLeft, a.offsetTop);
答案 5 :(得分:6)
使用evaluate
的简单JavaScript,如下所示:
page.evaluate(function() {
document.getElementById('yourId').click();
});
答案 6 :(得分:2)
我永远无法直接点击该元素。相反,我查看了html以找到使用onclick调用的函数,然后调用该函数。
答案 7 :(得分:2)
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);
},
答案 8 :(得分:2)
使用PhantomJS也可以双击。
这是根据the answer的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
事件,而不是其前应发生的其他事件。
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);
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);
答案 9 :(得分:2)
最简单的方法是使用jQuery。
page.evaluate(function() {
page.includeJs("your_jquery_file.js", function() {
page.evaluate(function() {
$('button[data-control-name="see_more"]').click();
});
});
});
答案 10 :(得分:0)
对于那些使用JQuery的人,JQuery UI创建了一个实用程序来模拟这些:jquery-simulate。我在PhantomJS和Chrome中使用它
$ele..simulate( "click" );