代码之家  ›  专栏  ›  技术社区  ›  Ankit Agrawal

夜间值班。js无法在循环中运行浏览器

  •  2
  • Ankit Agrawal  · 技术社区  · 7 年前

    我正在nightwatch中编写一个测试,以读取json数据并使用json文件中的所有值集运行浏览器。

    例如,我有一个json文件,其中包含多个用户的登录密码。 我想为json文件中提到的每个用户启动一个web浏览器,然后登录并关闭它。

    我的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文件中的每一组密码。 我浏览了几个论坛和教程,他们建议使用回调或承诺。 有谁能建议一个正确的方法来做这件事吗? 如果您发布相同的示例代码,这将非常有用。

    谢谢

    2 回复  |  直到 7 年前
        1
  •  3
  •   akrn    7 年前

    首先,在运行之后 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) {}
    };
    
        2
  •  0
  •   Stratos Ion    7 年前

    您唯一缺少的就是将代码包装在 browser.perform() . 虽然我不是百分之百的如果你能离开 .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();
          });
        })
      }
    }