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 没有经过很好的测试。 (从你的例子来看,你可能已经看过这些了。)
无论如何,我想我可以帮助解决您眼前的问题。两条建议:
- 使用相同的实例。 您可以将 Nightmare 实例的创建移动到
before()
块并使用相同的实例进行测试。但是,这引入了测试依赖性,并且通常被认为是不可取的。
- 将整个登录过程移至
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!");
});
});
我正在将 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 没有经过很好的测试。 (从你的例子来看,你可能已经看过这些了。)
无论如何,我想我可以帮助解决您眼前的问题。两条建议:
- 使用相同的实例。 您可以将 Nightmare 实例的创建移动到
before()
块并使用相同的实例进行测试。但是,这引入了测试依赖性,并且通常被认为是不可取的。 - 将整个登录过程移至
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!");
});
});