NightmareJS多重评估

时间:2016-10-27 18:53:41

标签: javascript mocha chai nightmare

当我运行一次评估时,NightmareJS运行良好,但当我与页面交互时,我需要做更多的评估。然而,使用文档我尝试了一个链接评估的简单示例,我收到一个错误:

lobal-css:
  css:
    theme:
      css/bootstrap.css: {}
      css/font-awesome.css: {}
      css/responsive-menu.min.css: {}
      css/style.css: {}
      
global-js:
  js:
    js/bootstrap.js: {}
    js/jquery.singlePageNav.min.js: {} 
    js/responsive-menu.js: {} 
    js/customscript.js: {}    
  dependencies:
      - core/jquery 

错误:

TypeError:nightmare.goto(...)。wait(...)。type(...)。click(...)。wait(...)。evaluate(...)。then (...)。等待不是一个功能

在这种情况下,我在下一次评估之前添加了一个等待,以防我需要让系统等待完成,但仍然无法正常工作。

1 个答案:

答案 0 :(得分:7)

问题是evaluate()会返回Promise,这是一个Javascript的东西而不是梦魇。

所以Promise有thencatch等方法,但显然没有wait方法。

我感谢this回答,这resource可以帮助您更好地理解这个概念。

将概念应用于您的场景,代码将如下所示

describe('test google search results', function() {
  this.timeout(15000);
  it('should find the nightmare github link first', function(done) {
    var nightmare = Nightmare({show: true})

    nightmare
      .goto('http://google.com')
      .wait(1000)
      .type('form[action*="/search"] [name=q]', 'github nightmare')
      .click('form[action*="/search"] [type=submit]')
      .wait(1000)//.wait('#rcnt')
      .evaluate(function () {
        return document.querySelector('div.rc h3.r a').href
      })
      .then(function(link) {
        console.log("TESTING 1");
        expect(link).to.equal('https://github.com/segmentio/nightmare');

        nightmare.evaluate(function () {
          return document.querySelector('div.rc h3.r a').href
        })
        .end()
        .then(function(link) {
          console.log("TESTING 2");
          expect(link).to.equal('https://github.com/segmentio/nightmare');
          done();
        })

      }).catch(function(error) {
        done(new Error(error))
      })
  });
});

请注意对evaluate的第二次调用是如何在第一个then回调中进行的。