我正在使用nightwatch编写测试来读取json数据并使用我的json文件中的所有值集运行浏览器。
例如,我有一个json文件,其中包含多个用户的登录密码。 我想为json文件中提到的每个用户启动一个Web浏览器并进行登录并关闭它。
我的json文件内容如下
try {
String url ="http://api.kolada.se/v2/municipality?title=lund";
InputStreamReader a = new InputStreamReader(new URL(url).openStream());
search_string b = new Gson().fromJson(a, search_string.class);
JOptionPane.showMessageDialog(this, b.toString());
}
catch (IOException ex) {
Logger.getLogger(WelcomeRESTXMLClientJFrame.class.getName()).log(Level.SEVERE, null, ex);
}
以下是我的夜班测试
{
"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"}
}]
}
以上代码在控制台上的json文件中打印所有三个密码,然后只启动浏览器一次。我想在json文件中为每组密码启动浏览器和登录。 我经历了几个论坛和教程,他们建议使用回调或承诺。 任何人都可以建议一个正确的方法吗? 如果您发布相同的示例代码,将会非常有用。
由于
答案 0 :(得分:2)
首先,在单次测试运行中运行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) {}
};
答案 1 :(得分:0)
您唯一缺少的是将代码包装在browser.perform()
中。虽然如果你可以将.end()
留在perform
内,我不是100%。试一试,让我知道。
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();
});
})
}
}