NightmareJS 在测试之间保持会话

NightmareJS persist session between tests

我正在将 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!");

    });
  });
});

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

无论如何,我想我可以帮助解决您眼前的问题。两条建议:

  1. 使用相同的实例。 您可以将 Nightmare 实例的创建移动到 before() 块并使用相同的实例进行测试。但是,这引入了测试依赖性,并且通常被认为是不可取的。
  2. 将整个登录过程移至 beforeEach() 块。 将整个登录单元测试移至 beforeEach() 块,以便您获得全新的体验每次测试都要登录。您还需要添加一个 afterEach() 块来清理噩梦实例。这将使您的测试可以独立运行,但也会为 运行 整个单元测试电池带来大量时间开销。

基于您的示例的 #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!");

    });
  });