我尝试使用SlimerJS点击页面上的按钮。
在SlimerJS文档中,我看到sendEvent(eventType, arg1, arg2, button, modifier)
允许我们通过X和Y坐标单击给定位置。 (Doc here)
所以,我试着通过以下方式获得按钮的X和Y:
var webpage = require("webpage").create();
function clickButton(button)
{
var rect = button.getBoundingClientRect();
webpage.sendEvent('click',rect.left,rect.top,'left',0);
}
webpage.open(url).then(function(){
var button = webpage.evaluate(function(){
signInButton = document.querySelector("#signIn");
return signInButton;
});
clickButton(button);
});
这样,不会抛出任何错误,但按钮似乎没有被点击。 这种做法有问题吗?有没有更好的办法?有没有办法点击按钮或链接提供它的ID或标签名称?
答案 0 :(得分:4)
这是一个很难的方法。 (顺便提一下,您无法从evaluate()
返回DOM对象,例如按钮,因此您最好将clickButton
内容移至evaluate()
内。)
简单的方法是使用CasperJS,这是PhantomJS / SlimerJS周围的更高级别的抽象层。那么你的例子就变成了:
var casper = require('casper').create();
casper.start(url, function(){
this.click('#signIn');
});
casper.run();
如果您想坚持使用PhantomJS,并且无论如何都要在页面中加载jQuery,那么它也相当容易:
var webpage = require("webpage").create();
webpage.open(url).then(function(){
this.evaluate(function(){
$("#signIn").click();
});
});
您的方法的替代方法是直接向DOM对象发送点击事件(即,而不是担心鼠标坐标):
var webpage = require("webpage").create();
webpage.open(url).then(function(){
this.evaluate(function(){
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window,
0, 0, 0, 0, 0, false, false, false, false, 0, null);
return document.querySelector('#signIn').dispatchEvent(evt);
};
});
为什么我认为这比处理鼠标键更好?因为使用坐标键的鼠标点击必须在可见按钮上,这意味着你必须担心你的视口;见https://stackoverflow.com/a/24861718/841830
(最后两个的来源为my own blog post,我还使用d3进行了介绍。)