SlimerJS单击链接/按钮

时间:2014-07-27 12:02:20

标签: javascript slimerjs

我尝试使用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或标签名称?

1 个答案:

答案 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进行了介绍。)