重新使用Selenium WebDriver的浏览器会话进行Nightwatch.js测试

时间:2014-11-19 20:28:30

标签: selenium selenium-webdriver automated-tests nightwatch.js

我需要编写多个测试(例如登录测试,登录测试时使用应用程序,注销测试等)并且需要将它们全部放在单独的文件中。我遇到的问题是在每次测试之后,在下一个测试运行开始时,新的浏览器会话启动并且由于新会话而不再登录,所以我的所有测试都将失败,除了登录测试。

那么,有没有办法使用相同的浏览器会话顺序运行我的所有测试而不必复制我的登录代码?很抱歉,如果这是一个转贴,但我已经搜索和研究,但没有找到任何答案。

或者,有没有办法以某种方式链接测试文件?就像你运行的一个文件只调用所有其他测试文件一样?

2 个答案:

答案 0 :(得分:8)

使用此功能将文件链接在一起:

extend = function(target) {
    var sources = [].slice.call(arguments, 1);
    sources.forEach(function (source) {
        for (var prop in source) {
            target[prop] = source[prop];
        }
    });
    return target;
}

并将文件添加到此主文件中,如下所示:

require("./testName.js");
module.exports = extend(module.exports,testName);

并让测试文件看起来像这样:

testName = {
    "Test" : function(browser) {

        browser
            // Your test code
    }
};

允许我有一个文件可以链接所有测试,并保持整个时间相同的浏览器会话。它按照您在主文件中需要的顺序运行测试,如果您不调用browser.end()直到最后一次测试完成,它将使用一个浏览器窗口进行所有测试。

答案 1 :(得分:3)

重复使用会话并不是一个好主意,因为你可以在不同的经纪人中进行测试,但是 您可以将登录代码放入函数之前,甚至可以将其提取到自定义命令中。

实施例: https://github.com/dimetron/backbone_app/blob/master/nightwatch/custom-commands/login.js

1 - 在nightwatch配置中添加

"custom_commands_path" : "nightwatch/custom-commands",

2 - 创建custom-commands / login.js

exports.command = function(username, password, callback) {
    var self = this;
    this
        .frame(null)
        .waitForElementPresent('input[name=username]', 10000)
        .setValue('input[name=username]', username)
        .waitForElementPresent('input[name=password]', 10000)
        .setValue('input[name=password]', password)
        .click('#submit');

    if( typeof callback === "function"){
        callback.call(self);
    }
    return this; // allows the command to be chained.
};

3 - 测试代码 - 在使用.login(用户,apssword)之前

 module.exports = {

  before: function(browser) {
    console.log("Setting up...");
    browser
      .windowSize('current', 1024, 768)
      .url("app:8000/") 
      .waitForElementVisible("body", 1000)
      .login('user', 'password')
  },

  after : function(browser) {
    browser.end()
    console.log("Closing down...");
  },

  beforeEach: function(browser) {
    browser
      .pause(2000)
      .useCss()
  },

  "Test 1": function(browser) {
    browser
      .assert.containsText("#div1", "some tex")
      .pause(5000);
  },

  "Test 2": function(browser) {
    browser
      .assert.containsText("#div2", "some text")
      .pause(5000);
  }
}