我在Windows 8.1上使用PhantomJS 1.9.7,输入用户名和密码后我会点击“登录”按钮。我可以写用户名和密码但是,当我想让PhantomJS点击按钮时,它可以找到该元素,但无法点击它。 我在以前的帖子中发现我需要创建事件并使用" dispatchEvent"。我做到了但是我得到了如下错误:
TypeError:' undefined'不是一个函数(评估' elm.dispatchEvent(event)')
我也试图从EventListener获得帮助,但我得到了相同的错误。
如何点击元素?
var page = require('webpage').create();
page.open('URL', function() {
var submitButton = enterUserAndPassAndLogin();
click(submitButton);
phantom.exit();
});
function enterUserAndPassAndLogin() {
var element = page.evaluate(function() {
document.querySelector('input[name="username"]').value = "*******";
document.querySelector('input[name="password"]').value = "*******";
return document.getElementsByTagName("Button");
});
return element;
}
function click(elm) {
var event = document.createEvent("MouseEvent");
event.initMouseEvent("click", true, true, window,
0, 0, 0, 0, 0, false, false, false, false, 0, null);
elm.dispatchEvent(event);
}
答案 0 :(得分:0)
代码有两个问题。第一个DOM元素不能从页面上下文(page.evaluate
)传递到外部。来自docs:
注意:evaluate函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。
闭包,函数,DOM节点等不起作用!
所以submitButton
是[null]
。由于返回了一个数组,因此错误消息不会显示实际问题。由于DOM元素无法传递到外部,因此点击必须在page.evaluate
内进行。
由于page.evaluate
是沙箱,因此必须在页面上下文中定义click
函数。无法直接访问外部的变量和函数。
可能的脚本是:
var page = require('webpage').create();
page.open('URL', function() {
enterUserAndPassAndLogin();
setTimeout(function(){
// wait a little to maybe see the click result
phantom.exit();
}, 1000);
});
function enterUserAndPassAndLogin() {
page.evaluate(function() {
function click(elm) {
var event = document.createEvent("MouseEvent");
event.initMouseEvent("click", true, true, window,
0, 0, 0, 0, 0, false, false, false, false, 0, null);
elm.dispatchEvent(event);
}
document.querySelector('input[name="username"]').value = "*******";
document.querySelector('input[name="password"]').value = "*******";
click(document.getElementsByTagName("Button")[0]);
});
}
答案 1 :(得分:-1)
只需插入Jquery并执行
$(selector).trigger('click');
注意,如果页面使用异步帖子,则页面加载事件不会触发,但是它正在加载"你必须等待回应。
可能会等待几秒钟,这样就足以让异步帖回来了。