1. 前言

1.1 安装和初始化

大多数情况下,为了执行命令或断言,nightwatch需要向WebDriver服务发起至少两次请求,第一次请求通过css选择器或Xpath表达式确定一个元素的位置,第二次请求才会在元素上执行实际的命令或断言。

安装WebDriver服务可以通过直接下载二进制文件或使用NPM软件包来完成。

可以选择使用Selenium Standalone Server来管理各种浏览器驱动程序和服务,但从Nightwatch 1.0开始不再需要,也不推荐使用,除非您针对旧浏览器(如Internet Explorer)进行测试。

{
"webdriver" : {
    "start_process": true,
    "server_path": "node_modules/.bin/chromedriver",
    "port": 9515
  }
}

官方教程实在是造成了严重的误导,关键是你安装完chromedriver这个包后,node_modules/.bin/chromedriver目录下面确实有一个chromedriver文件,但是我们需要的是chromedriver.exe文件。

我们可以通过.path属性获取包的安装路径(参考demo-01),也可以手动输入(参考demo-05)。

const chromedriver = require('chromedriver');

module.exports = (function(settings) {
  settings.test_workers = false;
  settings.webdriver.server_path = chromedriver.path;
  return settings;
})(require('./nightwatch.json'));

chrome端口号9515

firefox端口号4444,特别说明:firefox需要传入debug参数才能运行,这个坑真是坑死我了😂😂😂。

{
"webdriver": {
    "start_process": true,
    "server_path": "./node_modules/geckodriver/geckodriver.exe",
    "log_path": "output",
    "port": 4444,
    "cli_args": [
      "--log", "debug"
    ]
  }
}

** window下,firefox 默认寻找路径为C:\Program Files\Mozilla Firefox,如果安装在其它路径,需要指定moz:firefoxOptions属性或者使用--binary PATH命令,告诉geckodriver启动路径。

当你想要关闭测试时,请记住始终调用.end()方法,以便正确关闭浏览器会话。

1.2 before[Each] and after[Each] hooks

在测试中,nightwatch提供标准的before/afterbeforeEach/afterEach的钩子。

beforeafter将分别在执行测试套件之前和之后运行,而beforeEachafterEach分别在每个测试用例之前和之后运行(参见demo4-hooks)。

1.3 Asynchronous hooks

所有before[Each] and after[Each]都可以执行异步操作,只需要将回调函数作为第二个参数传入。

module.exports = {
  beforeEach: function(browser, done) {
    // 执行一个异步操作
    setTimeout(function() {
      // 完成异步任务
      done();
    }, 100);
  },

  afterEach: function(browser, done) {
    // 执行一个异步操作
    setTimeout(function() {
      // 完成异步任务
      done();
    }, 200);
  }
};

注意:当异步操作完成后,回调函数done必需作为最后一个步骤被调用,否则会导致超时错误。默认的超时时间是10s,可以通过指定asyncHookTimeout属性修改默认超时时间。

2. 运行测试

nightwatch提供命令行的方式来运行测试和生成测试报告,同时提供多种配置选项。

nightwatch [source] [options]

2.1 指定测试实例source

除了在nightwatch.json文件中配置src_folders来指定需要进行测试的实例,同样可以在命令行中直接传入测试实例。

// 测试单个文件
nightwatch tests/one/firstTest.js

// 独立的多个测试
nightwatch tests/one/firstTest.js tests/secondTest.js

// 独立的测试和整个文件夹
nightwatch tests/one/test.js tests/utils

2.2 命令行选项options

名称 简写 默认值 描述
--config -c ./nightwatch.json 指定启动nightwatch的配置文件
--output -o tests_output 指定测试报告的输出路径
--reporter -r junit 预定义报告者的名称或要使用的自定义报告文件的路径。
--env -e default 指定nightwatch的测试环境
--verbose 在会话期间显示扩展的selenium命令日志记录
--version -v 显示版本号
--test -t 指定测试实例
--testcase 只与--test一起使用
--group -g 指定测试组
--skipgroup -s 指定需要跳过的测试组
--filter -f 进行过滤操作
--tag -a 通过标签进行过滤
--skiptags 跳过指定的标签
--retries 重试失败或错误的测试用例达到指定的次数。
--suiteRetries 重试失败或错误的测试套件(测试模块)达到指定的次数。

2.3 Test Environments

你可以定义测试设置的多个环境,以便覆盖每个环境的特定值。

默认default环境是必需的。所有其他环境都是从默认环境继承的,可以根据需要覆盖设置。

{
  "test_settings" : {
    "default" : {
      "launch_url" : "http://localhost",
      "globals" : {
        "myGlobalVar" : "some value",
        "otherGlobal" : "some other value"
      }
    },

    "integration" : {
      "launch_url" : "http://staging.host",
      "globals" : {
        "myGlobalVar" : "other value"
      }
    }
  }
}

通过指定--env参数,我们可以选取特定的测试环(参见demo5-env)。

nightwatch --env integration

2.4 Test Tags

我们还可以选择性地将测试目标定位为基于标签运行,以便测试可以属于多个标签。

标签可以通过将@tags属性添加到测试模块来完成:

module.exports = {
  '@tags': ['login', 'sanity'],
  'demo login test': function (browser) {
     // test code
  }
};

通过命令行对测试标签进行控制:

// 选择特定标签的测试模块
nightwatch --tag login

// 选择多个标签的测试模块
nightwatch --tag login --tag something_else

// 跳过指定标签
nightwatch --skiptags login

2.5 Disabling Tests

要阻止测试模块运行,只需将该模块中的disabled属性设置为true,如下所示:

module.exports = {
  '@disabled': true, // 这会阻止测试模块运行

  'sample test': function (browser) {
    // test code
  }
};

3. Page Objects

待续...

https://blog.csdn.net/qq_25324335/article/details/82052509

4. 更多

本文demo源码地址:>>>点我进入