Nightwatch.js 无法 运行 浏览器循环
Nightwatch.js not able to run browser in loop
我正在 nightwatch 中编写一个测试来读取 json 数据和 运行 浏览器以及我的 json 文件中的所有值集。
例如,我有一个json文件,其中包含多个用户的登录密码。
我想为 json 文件中提到的每个用户启动一个网络浏览器,然后登录并关闭它。
我的json文件内容如下
{
"total_rows": 3,
"offset": 0,
"rows": [{
"id": "1",
"doc": {"username": "username1","password": "password1"}
},{
"id": "2",
"doc": {"username": "username2","password": "password3"}
},{
"id": "3",
"doc": {"username": "username3","password": "password3"}
}]
}
下面是我的守夜人测试
var fs = require('fs');
module.exports = {
'read CSV contents' : function (browser) {
var contents = fs.readFileSync("./config/testdata.json");
var jsonContent = JSON.parse(contents);
Object.keys(jsonContent.rows).forEach(element => {
console.log('##########')
console.log(jsonContent.rows[element].doc.password);
browser
.url('//some url')
.useXpath()
.setValue('//input[@id=\'username\']',jsonContent.rows[element].doc.username)
.setValue('//input[@id=\'password\']',jsonContent.rows[element].doc.password)
.pause(1000)
.end()
});
}
}
以上代码在控制台的 json 文件中打印所有三个密码,然后仅启动一次浏览器。我想启动浏览器并登录 json 文件中的每组密码。
我浏览了几个论坛和教程,他们建议使用回调或承诺。
谁能建议一个正确的方法来做到这一点?
如果您 post 有相同的示例代码,那将非常有帮助。
谢谢
您唯一缺少的是将您的代码包装在 browser.perform()
中。虽然我不是 100% 如果您可以将 .end()
留在 perform
内。试试看,让我知道。
var fs = require('fs');
module.exports = {
'read CSV contents' : function (browser) {
var contents = fs.readFileSync("./config/testdata.json");
var jsonContent = JSON.parse(contents);
browser.perform(function(){
Object.keys(jsonContent.rows).forEach(element => {
console.log('##########')
console.log(jsonContent.rows[element].doc.password);
browser
.url('//some url')
.useXpath()
.setValue('//input[@id=\'username\']',jsonContent.rows[element].doc.username)
.setValue('//input[@id=\'password\']',jsonContent.rows[element].doc.password)
.pause(1000)
.end();
});
})
}
}
首先,运行在单次测试中 end()
后 运行 nightwatch 会认为测试立即完成,您将无法恢复浏览器会话。
由于您想为每个用户名和密码打开和关闭浏览器 - 解决方案可能是在您的测试文件中定义多个测试 运行 函数。
不过这需要一些技巧,但应该可以正常工作:
var fs = require('fs');
var contents = fs.readFileSync("./config/testdata.json");
var jsonContent = JSON.parse(contents);
var exports = {};
jsonContent.rows.forEach(element => {
// Create a single test for each row passing "doc" object as the first parameter
exports['Testing row #' + element.id] = runTest.bind(null, element.doc);
});
function runTest(doc, client) {
client
.url('//some url')
// ... YOUR CODE GOES HERE
.end();
}
module.exports = exports;
在这里你基本上读取你的 JSON 文件,检查它的记录并为每条记录创建一个单独的测试 运行 函数,传递 doc
变量作为第一个参数使用 bind()
.
因此,对于守夜人来说,这个测试看起来像:
module.exports = {
'Testing row #1': function(client) {},
'Testing row #2': function(client) {},
'Testing row #3': function(client) {}
};
我正在 nightwatch 中编写一个测试来读取 json 数据和 运行 浏览器以及我的 json 文件中的所有值集。
例如,我有一个json文件,其中包含多个用户的登录密码。 我想为 json 文件中提到的每个用户启动一个网络浏览器,然后登录并关闭它。
我的json文件内容如下
{
"total_rows": 3,
"offset": 0,
"rows": [{
"id": "1",
"doc": {"username": "username1","password": "password1"}
},{
"id": "2",
"doc": {"username": "username2","password": "password3"}
},{
"id": "3",
"doc": {"username": "username3","password": "password3"}
}]
}
下面是我的守夜人测试
var fs = require('fs');
module.exports = {
'read CSV contents' : function (browser) {
var contents = fs.readFileSync("./config/testdata.json");
var jsonContent = JSON.parse(contents);
Object.keys(jsonContent.rows).forEach(element => {
console.log('##########')
console.log(jsonContent.rows[element].doc.password);
browser
.url('//some url')
.useXpath()
.setValue('//input[@id=\'username\']',jsonContent.rows[element].doc.username)
.setValue('//input[@id=\'password\']',jsonContent.rows[element].doc.password)
.pause(1000)
.end()
});
}
}
以上代码在控制台的 json 文件中打印所有三个密码,然后仅启动一次浏览器。我想启动浏览器并登录 json 文件中的每组密码。 我浏览了几个论坛和教程,他们建议使用回调或承诺。 谁能建议一个正确的方法来做到这一点? 如果您 post 有相同的示例代码,那将非常有帮助。
谢谢
您唯一缺少的是将您的代码包装在 browser.perform()
中。虽然我不是 100% 如果您可以将 .end()
留在 perform
内。试试看,让我知道。
var fs = require('fs');
module.exports = {
'read CSV contents' : function (browser) {
var contents = fs.readFileSync("./config/testdata.json");
var jsonContent = JSON.parse(contents);
browser.perform(function(){
Object.keys(jsonContent.rows).forEach(element => {
console.log('##########')
console.log(jsonContent.rows[element].doc.password);
browser
.url('//some url')
.useXpath()
.setValue('//input[@id=\'username\']',jsonContent.rows[element].doc.username)
.setValue('//input[@id=\'password\']',jsonContent.rows[element].doc.password)
.pause(1000)
.end();
});
})
}
}
首先,运行在单次测试中 end()
后 运行 nightwatch 会认为测试立即完成,您将无法恢复浏览器会话。
由于您想为每个用户名和密码打开和关闭浏览器 - 解决方案可能是在您的测试文件中定义多个测试 运行 函数。
不过这需要一些技巧,但应该可以正常工作:
var fs = require('fs');
var contents = fs.readFileSync("./config/testdata.json");
var jsonContent = JSON.parse(contents);
var exports = {};
jsonContent.rows.forEach(element => {
// Create a single test for each row passing "doc" object as the first parameter
exports['Testing row #' + element.id] = runTest.bind(null, element.doc);
});
function runTest(doc, client) {
client
.url('//some url')
// ... YOUR CODE GOES HERE
.end();
}
module.exports = exports;
在这里你基本上读取你的 JSON 文件,检查它的记录并为每条记录创建一个单独的测试 运行 函数,传递 doc
变量作为第一个参数使用 bind()
.
因此,对于守夜人来说,这个测试看起来像:
module.exports = {
'Testing row #1': function(client) {},
'Testing row #2': function(client) {},
'Testing row #3': function(client) {}
};