【问题标题】:Repeat Nightwatch test automatically自动重复 Nightwatch 测试
【发布时间】:2018-01-29 16:47:21
【问题描述】:

有谁知道我可以自动重新运行 Nightwatch 测试一定次数的方法吗?

我有以下代码:

module.exports = {
  'Log into system - create order': function (client) {
    client
      .url('XXXX')
      .waitForElementVisible('body', 1000)
      .assert.title('Reach - Log in')
      .assert.visible('#UserName')
      .setValue('#UserName', 'XXXX')
      .assert.visible('#Password')
      .setValue('#Password', 'XXXX')
      .assert.visible('input[value="Login"]')
      .click('input[value="Login"]')
      .waitForElementVisible('img.test', 1000)
      .assert.visible('li[title="XXXX"] a[tabindex="5"]')
      .click('li[title="Sales"]')
      .assert.cssClassPresent('li[title="XXXX"]', 'active')
      .click('a[href="/Quotes/Add"]')
      .waitForElementVisible('#s2id_CustomerId_Remote', 1000)
      .click('#s2id_CustomerId_Remote')
      .assert.visible('#s2id_autogen2_search')
      .setValue('#s2id_autogen2_search', 'bik')
      .waitForElementVisible('.select2-highlighted', 1000)
      .click('.select2-highlighted')
      .waitForElementVisible('#customerNotes', 1000)
      .click('#s2id_ProductId_Remote')
      .assert.visible('#s2id_autogen3_search')
      .setValue('#s2id_autogen3_search', '123XP')
      .pause(5000)
      .assert.visible('.select2-highlighted')
      .click('.select2-highlighted')
      .pause(5000)
      .assert.visible('.ui-sortable > tr')
      .setValue('#Quote_PONumber', 'abc123')
      .click('input[value="Create Order"]')
      .waitForElementVisible('.ac-order-number', 1000)
      .assert.visible('a[data-value="abc123"]')
      .pause(5000)
      .end()
  }
}

而不是.end() 测试我想.rerun() 测试说30 次。我在文档中的任何地方都看不到执行此操作的选项。

非常感谢。

【问题讨论】:

    标签: selenium nightwatch.js


    【解决方案1】:

    您可以将命令包装在 client.perform() 和 for 循环中

    client.perform(function(){
        for (i = 0; i < 29; i++) { 
          client
            .url('XXXX')
            .
            .
            .
            .end();
        }
    })
    

    【讨论】:

      【解决方案2】:

      您需要一点异步迭代逻辑和client.perform() 函数:

      module.exports = {
        'Log into system - create order': function (client) {
          var currentIteration = 0,
              iterationCount = 30;
      
          function runTest() {
            client
              .url('XXXX')
      
              // ... YOUR CODE HERE, WITHOUT .end()
      
              .perform(function() {
                if (++currentIteration < iterationCount) {
                  return runTest();
                }
      
                client.end(); // After passing 30 iterations end the session
              });
          }
      
          runTest();
        }
      };
      

      【讨论】:

      • @akm 您可以建议改进现有答案,而不是发布相同的不同迭代。
      • @StratosIon 恕我直言,与我的示例相比,您提供的代码完全不同,并且根本无法工作,因为您正在尝试同步迭代异步代码
      • @akm 除非您在本地尝试过并且我正在做其他有效的方法,否则您还能如何证明您的主张?
      • @StratosIon 尝试运行它。 .end() 调用将在第一次迭代后结束会话。此外,在您的情况下,client.perform() 是多余的,因为您可以将您的 for 循环放在测试方法主体中。关于循环,如果由于某种原因,您在测试期间需要当前迭代的索引,它总是 28,但是为了解决这个问题,您可以将 let 放在 i 声明之前。
      【解决方案3】:

      如果你想用不同的输入重复他的测试?那么你可以做这样的事情

      module.exports = {
        "Login Fail Cases": function(browser) {
          let dataSet = [
            { username: "madhus", pass: "madhus" },
            { username: "admin", pass: "admin" }
          ];
      
         //will run for 2 times as length of dataset is 2
          dataSet.forEach(function(data) {
            browser
              .url("https://localhost:3000/")
              // you tests here
          }, this);
      
          // note: end the test outside the loop once all tests are executed
          browser.end();
        }
      };
      

      【讨论】:

        猜你喜欢
        • 2018-09-08
        • 1970-01-01
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 2017-09-21
        • 2018-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多