我已经把这个问题简化为一个公共站点的最小示例。单击“全部显示”按钮会触发更多的站点在每个浏览器中可见,但在“噩梦”中不可见:
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中有效,但在噩梦中不起作用。下面是运行上述示例的调试输出,没有显示任何异常: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
最佳答案
事实证明,这是开发人员知道的phantomjs的一个问题,但它来自上游的webkit,使其不适合他们。当站点使用modernizer(或类似的)检查phantom提供的触摸支持时,就会发生这种情况。当然,单击在事件队列中是不可触摸的,而噩梦的单击只会触发前者。
带噩梦的github issue有所有链接可供学习更多内容。