首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PhantomJS;单击元素

PhantomJS;单击元素
EN

Stack Overflow用户
提问于 2013-04-01 15:16:10
回答 10查看 84.4K关注 0票数 82

如何在PhantomJS中单击元素?

代码语言:javascript
复制
page.evaluate(function() {
    document.getElementById('idButtonSpan').click();  
});

这会给我一个错误:"undefined is not a function...“

如果我转而

代码语言:javascript
复制
 return document.getElementById('idButtonSpan');

然后把它打印出来

然后它打印对象对象,因此元素确实存在。

元素充当一个按钮,但它实际上只是一个span元素,而不是一个提交输入。

我可以点击这个按钮来使用Casper,但是Casper有其他限制,所以我回到了PhantomJS。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2013-04-11 20:06:11

.click()不是标准的。您需要创建一个事件并将其分派:

代码语言:javascript
复制
function click(el){
    var ev = document.createEvent("MouseEvent");
    ev.initMouseEvent(
        "click",
        true /* bubble */, true /* cancelable */,
        window, null,
        0, 0, 0, 0, /* coordinates */
        false, false, false, false, /* modifier keys */
        0 /*left*/, null
    );
    el.dispatchEvent(ev);
}
票数 68
EN

Stack Overflow用户

发布于 2013-07-22 22:18:10

作为@torazaburo响应的替代方案,您可以在PhantomJS中运行时将HTMLElement.prototype.click存根。例如,我们使用PhantomJS + QUnit来运行我们的测试,在我们的qunit-config.js中,我们有如下内容:

代码语言:javascript
复制
if (window._phantom) {
  // Patch since PhantomJS does not implement click() on HTMLElement. In some 
  // cases we need to execute the native click on an element. However, jQuery's 
  // $.fn.click() does not dispatch to the native function on <a> elements, so we
  // can't use it in our implementations: $el[0].click() to correctly dispatch.
  if (!HTMLElement.prototype.click) {
    HTMLElement.prototype.click = function() {
      var ev = document.createEvent('MouseEvent');
      ev.initMouseEvent(
          'click',
          /*bubble*/true, /*cancelable*/true,
          window, null,
          0, 0, 0, 0, /*coordinates*/
          false, false, false, false, /*modifier keys*/
          0/*button=left*/, null
      );
      this.dispatchEvent(ev);
    };
  }
}
票数 34
EN

Stack Overflow用户

发布于 2014-06-04 07:27:30

它并不美观,但我一直在使用它来允许我使用jQuery进行选择:

代码语言:javascript
复制
var rect = page.evaluate(function() {
    return $('a.whatever')[0].getBoundingClientRect();
});
page.sendEvent('click', rect.left + rect.width / 2, rect.top + rect.height / 2);

但是,如果不使用document.querySelector(s),则始终可以用jQuery替换$(s)[0]

(它确实依赖于视图中的元素,即你的viewportSize.height足够大)。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15739263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档