2

我正在尝试使用 SlimerJS 单击页面上的按钮。

在 SlimerJS 文档中,我看到sendEvent(eventType, arg1, arg2, button, modifier)它允许我们通过 X 和 Y 坐标单击给定位置。(文档在这里)

因此,我尝试通过以下方式获取按钮坐标的这些 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 或标签名称?

4

1 回答 1

4

这是一个相当困难的方法。(顺便说一句,您不能将 DOM 对象(如按钮)从 传回evaluate(),因此最好将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

(最后两个的来源是我自己的博客文章,我也使用 d3 进行了介绍。)

于 2014-07-28T10:44:53.130 回答