Nightwatch.js无法在循环中运行浏览器

时间:2018-01-26 18:51:45

标签: javascript node.js selenium nightwatch.js

我正在使用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文件中为每组密码启动浏览器和登录。 我经历了几个论坛和教程,他们建议使用回调或承诺。 任何人都可以建议一个正确的方法吗? 如果您发布相同的示例代码,将会非常有用。

由于

2 个答案:

答案 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文件,查看其记录并为每条记录创建单独的测试运行函数,并使用docbind()变量作为第一个参数传递。

因此,对于夜间表,这个测试看起来像:

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();
      });
    })
  }
}