如何修复不传播的噩梦 .click() 问题?

How to fix nightmare .click() issue not propagating through?

我已将我遇到的问题减少到这个带有 public 站点的最小示例。单击 'show-all' 按钮会触发更多站点在每个浏览器中可见,但不是噩梦:

var Nightmare = require('nightmare');

new Nightmare({timeout: 60000})
  .viewport(1920, 10000)
  .goto('http://mtv.de/charts/5-hitlist-germany-top-100')
  .wait(10000)
  .screenshot('before.png')
  .click('div#content div.chart-container a.button.show-all')
  .wait(20000)
  .screenshot('after.png')
  .run();

我不知道为什么这不起作用,我什至尝试用 jQuery('...').trigger('click') 触发点击,它在 Chrome 中有效,但在噩梦中却不行 .evaluate(...) .这是上述示例 运行 的调试输出,没有显示任何异常:

nightmare queueing action "viewport" +0ms
nightmare queueing action "goto" +3ms
nightmare queueing action "wait" +0ms
nightmare queueing action "screenshot" +0ms
nightmare queueing action "click" +0ms
nightmare queueing action "wait" +0ms
nightmare queueing action "screenshot" +0ms
nightmare run +0ms
nightmare .setup() creating phantom instance with options {"timeout":60000,"interval":50,"weak":true,"loadImages":true,"ignoreSslErrors":true,"sslProtocol":"any","proxy":null,"proxyType":null,"proxyAuth":null,"cookiesFile":null,"webSecurity":true} +0ms
nightmare .setup() phantom instance created +588ms
nightmare .setup() phantom page created +4ms
nightmare .viewport() to 1920 x 10000 +2ms
nightmare .goto() url: http://mtv.de/charts/5-hitlist-germany-top-100 +2ms
nightmare .goto() page loaded: success +3s
nightmare .wait() for 10000ms +501ms
nightmare .screenshot() saved to before.png +10s
nightmare .click() on div#content div.chart-container a.button.show-all +2s
nightmare .wait() for 20000ms +11ms
nightmare .screenshot() saved to after.png +20s
nightmare .teardownInstance() tearing down +2s

我找不到为什么它不起作用,但您可以简单地在 url.

中使用 ?expanded=true 参数加载 url

我尝试了 CasperJS,方法如下:

  • 使用 PhantomJS 的 CasperJS 原生点击 page.sendEvent,
  • synthetic PhantomJS click(类似于 Nightmare 使用的那个)和
  • 天真的点击:document.querySelector(selector).click().

我注册了所有活动,其中 none 提供了任何线索。

事实证明这是开发人员知道的 phantomjs 问题,但来自上游 webkit,因此无法修复。当网站使用 Modernizr(或类似软件)检查 phantom 提供的触摸支持时,就会发生这种情况。当然点击在事件队列中不算触摸,nightmare的点击只会触发前者。

github issue with nightmare 包含所有链接以了解更多信息。