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

时间:2015-01-09 10:47:57

标签: javascript node.js phantomjs nightmare

我已经通过公共网站减少了我对这个最小例子的问题。点击“全部显示”按钮会触发更多网站在每个浏览器中都可见,但不会出现在恶梦中:

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

2 个答案:

答案 0 :(得分:3)

这对于开发人员所知道的phantomjs来说是一个问题,但它来自上游webkit,使其无法修复。当站点使用Modernizr(或类似)来检查幻像提供的触摸支持时,就会发生这种情况。当然,点击不是事件队列中的触摸,而梦魇的点击只触发前者。

带有噩梦的github issue拥有了解更多内容的所有链接。

答案 1 :(得分:0)

我无法找出原因无法解决的原因,但您只需在网址中加载?expanded=true参数的网址即可。

我用以下方法尝试了CasperJS:

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

我注册了所有活动,但没有提供任何线索。