编写页面特定的命令

概述

您可以使用 `commands` 属性将自定义命令添加到页面对象。这是一种封装页面逻辑的有效方法,否则这些逻辑将存在于测试中或多个测试中。

Nightwatch 将在页面或部分的上下文中调用该命令。诸如 `pause` 之类的客户端命令可通过 `this.api` 获取。为了进行链接,每个函数都应返回页面对象或部分。

示例

在这种情况下,命令用于封装单击提交按钮的逻辑

nightwatch/pages/samplePage.js
const googleCommands = {
  submit: function() {
    this.api.pause(1000);
    
return this.waitForElementVisible('@submitButton', 1000) .click('@submitButton') .waitForElementNotPresent('@submitButton'); } };
module.exports = { commands: [googleCommands], elements: { searchBar: { selector: 'input[type=text]' }, submitButton: { selector: 'input[name=btnK]' } } };

然后测试很简单
module.exports = {
  'Test': function (browser) {
    var google = browser.page.google();
    google.setValue('@searchBar', 'nightwatch')
      .submit();
    
browser.end(); } };

基于类的页面命令

从 Nightwatch 2 开始,还可以将页面命令导出为 ES6 类。

这是一个基本示例

nightwatch/pages/commands/basicCommands.js
module.exports = class {
  basicCommand() {
    return {
      basicResult: 'from-helper-class'
    };
  }
  
dropdownSelect() { return this; }
dropdownSelectByText() { return this; }
name() { return this; } };

对于更详细的示例... 您可以通过 `this.page` 引用主页面对象。该类将自动实例化,您无需执行任何其他操作,只需编写它即可

nightwatch/pages/realcommands.js
module.exports = class RealCommands {
  customFindElements(selector, callback = function(r) {return r}) {
    return this.page.findElements({
      selector,
      suppressNotFoundErrors: true
    }, function(result) {
      return callback(result ? result.value: []);
    });
  }
  
async customFindElementsES6(selector) { const result = await this.page.findElements({ selector, suppressNotFoundErrors: true });
return result; } };