我正在尝试使用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或标记名?
发布于 2014-07-28 18:44:53
这是一种很难做到的方法。(顺便说一句,您不能从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。)
https://stackoverflow.com/questions/24980729
复制相似问题