简体   繁体   English

Nightwatch:在页面对象内使用自定义命令

[英]Nightwatch: Using of custom commands inside page objects

For the new version of a product I decided to try a page objects approach instead of using views and probably I started to use it wrong.对于新版本的产品,我决定尝试使用页面对象方法而不是使用视图,可能我开始使用它是错误的。

We have a custom command that simply waits for an element and clicks (waitAndClick.js):我们有一个自定义命令,它只是等待一个元素并点击(waitAndClick.js):

exports.command = function(selector, callback) {
  return this
    .waitForElementPresent(selector, 30000)
    .click(selector, callback);
};

It works perfectly inside the test:它在测试中完美运行:

const {client} = require('nightwatch-cucumber');
const {defineSupportCode} = require('cucumber');

defineSupportCode(({Given, Then, When}) => {
    Given(/^I enable Dashboard management$/, () => {
        return client.waitAndClick('[id=enableManagement]');
    });
});

But when I am trying to use it inside the page object it throws an error:但是当我尝试在页面对象中使用它时,它会引发错误:

module.exports = {
  url() {
    return this.api.launchUrl;
  },
  elements: {
    username: '[name="_Nitro_Login_username"]',
    password: '[name="_Nitro_Login_password"]',
    enter_button: '[title="Enter"]'
  },
  commands: [
    {
      loginAs(username, password) {
        return this.waitForElementVisible('@username', 50000)
          .setValue('@username', username)
          .setValue('@password', password)
          .waitAndClick('@enter_button')
          .waitForElementNotPresent('@enter_button', 50000);
      }
    }
  ]
};

I also tried with .api.waitAndClick('@enter_button'), the same result.我也尝试过 .api.waitAndClick('@enter_button'),结果相同。

And the error message:和错误信息:

Error while running click command: Provided locating strategy is not supported: [title="enter"].运行单击命令时出错:不支持提供的定位策略:[title="enter"]。 It must be one of the following:它必须是以下之一:

class name, css selector, id, name, link text, partial link text, tag name, xpath类名、css 选择器、id、名称、链接文本、部分链接文本、标签名称、xpath

 at Object.exports.command (/Users/eaflor/dev/jive-next/test/ui/commands/waitAndClick.js:9:63) at Object.F.command (/Users/eaflor/dev/jive-next/node_modules/nightwatch/lib/core/api.js:274:31) at Object.commandFn (/Users/eaflor/dev/jive-next/node_modules/nightwatch/lib/core/api.js:287:24) at AsyncTree.runCommand (/Users/eaflor/dev/jive-next/node_modules/nightwatch/lib/core/queue.js:154:30) at AsyncTree.runChildNode (/Users/eaflor/dev/jive-next/node_modules/nightwatch/lib/core/queue.js:114:8) at AsyncTree.walkDown (/Users/eaflor/dev/jive-next/node_modules/nightwatch/lib/core/queue.js:80:10) at AsyncTree.walkUp (/Users/eaflor/dev/jive-next/node_modules/nightwatch/lib/core/queue.js:97:8) at AsyncTree.walkDown (/Users/eaflor/dev/jive-next/node_modules/nightwatch/lib/core/queue.js:90:12) at AsyncTree.traverse (/Users/eaflor/dev/jive-next/node_modules/nightwatch/lib/core/queue.js:73:8) at F.onCommandComplete (/Users/eaflor/dev/jive-next/node_modules/nightwatch/lib/core/queue.js:131:12) at Fg (events.js:291:16) at emitNone (events.js:86:13) at F.emit (events.js:185:7) at /Users/eaflor/dev/jive-next/node_modules/nightwatch/lib/api/client-commands/_locateStrategy.js:18:10 at _combinedTickCallback (internal/process/next_tick.js:67:7) at process._tickCallback (internal/process/next_tick.js:98:9)

Is it even possible to use custom commands inside the page object?甚至可以在页面对象内使用自定义命令吗?

I found the way to fix it.我找到了修复它的方法。 In order to use custom commands in page objects you have to write them in class-style: http://nightwatchjs.org/guide#writing-custom-commands为了在页面对象中使用自定义命令,您必须以类样式编写它们: http : //nightwatchjs.org/guide#writing-custom-commands

Here how it should look like:它应该是这样的:

var util = require('util');
var events = require('events');

function waitAndClick() {
    events.EventEmitter.call(this);
}

util.inherits(waitAndClick, events.EventEmitter);

waitAndClick.prototype.command = function(selector) {
    const api = this.client.api;

    api
            .waitForElementPresent(selector)
            .click(selector, () => {
                this.emit('complete');
            })
    ;

    return this;
};

module.exports = waitAndClick;

Hope it will help someone.希望它会帮助某人。

I'm still new with Nightwatch, but I'm using commands in Page Objects like this:我还是 Nightwatch 的新手,但我在页面对象中使用命令,如下所示:

commands: [
    {
        login: function() {
            this.api
                .waitForElementVisible('body', 2000)
                .setValue(this.elements.username.selector, user.loginUser) //here I'm inputting username from json file into element that I've defined in this page object
                .setValue(this.elements.password.selector, pass.loginPass) //here I did same thing with password
                .pause(500)
                .click(this.elements.submitButton.selector) //here I'm clicking on predefined button element               
        }
    }
]

Works perfectly, and it's very readable.完美运行,而且可读性很强。 This is simple login command.这是简单的登录命令。 Hope this helps.希望这会有所帮助。

Cheers干杯

Too late for an answer here but might help others facing similar issue.在这里回答为时已晚,但可能会帮助面临类似问题的其他人。 Returning this could fix the chaining issue from the page object.返回this可以解决页面对象的链接问题。

exports.command = function(selector, callback) {
  this
    .waitForElementPresent(selector, 30000)
    .click(selector, callback);
  return this;
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM