NightmareJS坚持测试之间的会话

时间:2016-02-22 15:20:15

标签: node.js mocha nightmare

我正在使用NightmareJS和Mocha。一切似乎都运行良好,但我在分离测试时遇到问题,因为我的会话不会在不同的测试用例中持续存在。

第一个测试正在通过,但第二个测试Should be able to edit失败,因为即使我使用分区选项,我也会在同一个登录页面上结束。我怎么能克服这个?

require('mocha-generators').install();
var Nightmare = require('nightmare');
var expect = require('chai').expect;

describe('Nightmare JS tests', function() {
  this.timeout(30000);

  var url = 'http://localhost/app/';

  describe('base functionality', function() {

    it('Should be able to login', function*() {
        var nightmare = Nightmare({
            show: true,
            'webPreferences': {
                partition: 'persist:somesession'
            }
        });
        var result = yield nightmare
                .goto(url)
                .wait('.login')
                .click('.login')
                .wait('h4.heading')
                .wait(1000)
                .evaluate(function () {
                    return document.querySelector('h4.heading').innerHTML;

                })
                .end();

        expect(result).to.equal("This is heading");

    });

    it('Should be able to edit', function*() {
        var nightmare = Nightmare({
            show: true,
            'webPreferences': {
                partition: 'persist:somesession'
            }
        })
        var result = yield nightmare
                .goto('http://localhost/app/company')
                .wait("button.edit")
                .click("button.edit")
                .wait("input[type='text']")
                .insert("input[type='text']", false)
                .insert("input[type='text']", "This is some address")

                .click("button[type='submit']")
                .wait("div.success")
                .evaluate(function () {
                    return document.querySelector("div.success").innerText;

                })
                .end()

        expect(result).to.contain("Updated!");

    });
  });
});

1 个答案:

答案 0 :(得分:5)

关于共享会话,关于Nightmare Github项目(有关更多信息,请参阅#430#398)围绕此主题进行了一些讨论。 TL; DR版本是您可以重置会话,但跨实例使用相同的会话未经过充分测试。 (从你的例子来看,看起来你可能已经看过这些了。)

无论如何,我认为我可以帮助解决您当前的问题。两个建议:

  1. 使用相同的实例。您可以将Nightmare实例的创建移动到before()块,并使用相同的实例进行测试。然而,这引入了测试依赖性,并且通常被认为是不合需要的。
  2. 将整个登录过程移至beforeEach()块。将整个登录单元测试移至beforeEach()块,以便每次测试都获得全新登录。您还需要添加afterEach()块来清理恶梦实例。这将使您的测试可以独立运行,但也会为运行整个单元测试电池带来大量的时间开销。
  3. 基于您的样本的#2(未经测试)示例可能会有所帮助:

    require('mocha-generators').install();
    var Nightmare = require('nightmare');
    var expect = require('chai').expect;
    
    describe('Nightmare JS tests', function() {
      this.timeout(30000);
    
      var url = 'http://localhost/app/';
    
      describe('base functionality', function() {
        var nightmare;
        beforeEach(function*() {
          nightmare = Nightmare({
            show: true,
          });
          yield nightmare
            .goto(url)
            .wait('.login')
            .click('.login')
            .wait('h4.heading')
            .wait(1000)
        });
    
        afterEach(function*() {
          yield nightmare.end();
        });
    
        it('Should be able to edit', function*() {
          var result =
            yield nightmare
            .goto('http://localhost/app/company')
            .wait("button.edit")
            .click("button.edit")
            .wait("input[type='text']")
            .insert("input[type='text']", false)
            .insert("input[type='text']", "This is some address")
    
          .click("button[type='submit']")
            .wait("div.success")
            .evaluate(function() {
              return document.querySelector("div.success").innerText;
    
            });
          expect(result).to.contain("Updated!");
    
        });
      });