PhantomJS; 单击一个元素

IT技术 javascript click phantomjs
2021-01-18 09:37:47

如何单击 PhantomJS 中的元素?

page.evaluate(function() {
    document.getElementById('idButtonSpan').click();  
});

这给了我一个错误“未定义不是函数......”

如果我改为

 return document.getElementById('idButtonSpan');

然后打印出来

然后它打印 [object object],因此该元素确实存在。

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

我能够点击此按钮以与 Casper 一起使用,但 Casper 有其他限制,所以我又回到了 PhantomJS。

6个回答

.click()不是标准的。您需要创建一个事件并调度它:

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);
}
document.querySelector(element).click() 对我来说很好用。
2021-03-10 09:37:47
经过近12个小时的持续斗争后,我的喜悦的泪水!嗅探嗅探!
2021-03-12 09:37:47
要使用自定义控件,我必须使用 3 个事件制作更复杂的解决方案: function triggerMouseEvent(elm, eventType) { var ev = document.createEvent("MouseEvent"); ev.initMouseEvent( eventType, true /* 气泡/, true /可取消/, window, null, 0, 0, 0, 0, /坐标/ false, false, false, false, /修饰键*/ 0 /*left* /, 空值 ); elm.dispatchEvent(ev); } function click(elm) { triggerMouseEvent(elm, 'mousedown'); triggerMouseEvent(elm, 'mouseup'); triggerMouseEvent(elm, 'click'); }
2021-03-12 09:37:47
对我来说也很好,但必须记住不要在处理完成之前过早退出 PhantomJS。我需要一个简短的脚本,只需单击一个按钮即可退出。这对我不起作用,直到我从 page.onLoadFinished = function() {...}; 中调用 phantom.exit();
2021-03-13 09:37:47
el使用 jQuery包装为您提供了这种点​​击定义。它可以在您的浏览器和 Phantom 中运行。$(el).click()
2021-03-31 09:37:47

替代@torazaburo 的回应,您可以HTMLElement.prototype.click在 PhantomJS 中运行时存根例如,我们使用 PhantomJS + QUnit 来运行我们的测试,qunit-config.js我们有这样的东西:

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);
    };
  }
}
请注意,我正在使用 PhantomJs 1.9.7-14 运行 Karma 0.12.17。没有window._phantom对象,所以我只是删除了那个条件,它按预期工作。
2021-03-11 09:37:47
我想知道该函数是否应该接受参数以便为 MouseEvent 设置不同的坐标
2021-03-14 09:37:47

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

var rect = page.evaluate(function() {
    return $('a.whatever')[0].getBoundingClientRect();
});
page.sendEvent('click', rect.left + rect.width / 2, rect.top + rect.height / 2);

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

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

尝试了所有可能的方法,这是尝试单击tr.
2021-03-14 09:37:47
使用 phantomjs 1.9.0 和 <a> 元素
2021-03-20 09:37:47
最好的解决方案imo, +1
2021-04-05 09:37:47

希望下面的方法有用。它在 1.9 版中对我有用

page.evaluate(function(){
    var a = document.getElementById("spr-sign-in-btn-standard");
    var e = document.createEvent('MouseEvents');
    e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    a.dispatchEvent(e);
    waitforload = true;
});

这对我有用。希望这对其他人也有用

@QadirHussain 实际上是在等待页面完全加载。这几乎就像设置特定时间来加载页面。
2021-03-18 09:37:47
@Jobins john whats waitforload = true?
2021-03-28 09:37:47

有了1.9.2这个工作对我来说,被触发的点击处理程序:

var a = page.evaluate(function() {
    return document.querySelector('a.open');
});

page.sendEvent('click', a.offsetLeft, a.offsetTop);
它不是在所有元素上。例如 <a> 没有它。在按钮上它就在那里。
2021-04-03 09:37:47