Nightwatch.js 设置值并执行

Nightwatch.js setValue and execute

Nightwatch 0.9.19
Node: 9.3.0
OS: darwin x64

exports.command = function (username, password) {
    const TIMEOUT = 6000;
    const USER_NAME = '[name="username"]';
    const PASSWORD = '[name="password"]';
    const BODY = 'body';
    const FORM = 'form';
    if (!username) {
        username = this.globals.username;
    }
    if (!password) {
        password = this.globals.password;
    }
    console.log('login', this.globals.baseUrl, username, password);

    this.url(this.globals.baseUrl)
        .waitForElementVisible(BODY, TIMEOUT)
        .setValue(USER_NAME, username)
        .getValue(USER_NAME, (result) => {
            console.log(`=====> Username is: ${result.value} <=====`);
        })
        .waitForElementVisible(USER_NAME, TIMEOUT)
        .waitForElementVisible(PASSWORD, TIMEOUT);

    this
        .execute(function (data) {
            document.querySelector(PASSWORD).value = password;
            return true;
        }, [], null)
        .pause(TIMEOUT)
        .getValue(PASSWORD, (result) => {
            console.log(`=====> Password is: ${result.value} <=====`);
        })
        .submitForm(FORM)
};
  1. 当我设置硬编码密码时:1q2w3e4r 就可以了。如果我使用变量,它不会。
  2. .setValue(password) ==> 结果:1q2we4r(缺失:3)

我看到您正在尝试使用以下代码在密码字段上设置一个值:

this
    .execute(function (data) {
        document.querySelector(PASSWORD).value = password;
        return true;
    }, [], null)

函数内的 PASSWORDpassword 变量在执行时都是 undefined

这里的问题是,基本上您传递给 execute 的函数将在您正在测试的网页(浏览器 JavaScript 引擎)的上下文中 运行 而不是当前脚本的上下文 (node.js).

但是,如果您需要将一些参数传递给此类函数,您可以使用 execute() 的第二个参数,它基本上是传递给函数的参数数组。

修复上面的代码片段后,您应该得到以下内容:

this
    .execute(function (PASSWORD, password) {
        document.querySelector(PASSWORD).value = password;
        return true;
    }, [PASSWORD, password], null)

关于 execute() 的文档:http://nightwatchjs.org/api/execute.html