1

我正在使用实习生进行功能测试。其中一项测试需要登录管理员帐户:

registerSuite({
    name: 'login',

    'login': function() {
        return this.remote
            .get(URL)
            .findById('username')
                .click()
                .pressKeys(USER.ADMIN.USERNAME)
                .end()
            .findById('password')
                .click()
                .pressKeys(USER.ADMIN.PASSWORD)
                .pressKeys('\n')
                .end()
            .findByCssSelector('.login-welcome')
                .getVisibleText()
            .then(function(text) {
                assert.strictEqual(text, USER.ADMIN.NAME, 'User should now be logged in');
            });
    }
});

现在,问题是这个密码是作为纯文本传入的。它在 BrowserStack 上显示:

00:19 | 0 | Send a sequence of key strokes to the active element. | password

在 SauceLabs 上也是如此:

COMMAND: POST keys
PARAMETERS: {"value":["password"]}

问题在于这些测试的访问不受限制——这些测试需要其他部门的人查看。

即使没有这个,万一测试帐户的密码被泄露,我也不希望攻击者突然获得对其他所有内容的管理员访问权限。

有什么办法可以使密码不在命令中存储/显示为纯文本?

我的团队目前正在考虑运行单独的脚本来激活/停用这些帐户,以便它们仅在运行功能测试时工作,但我想看看是否有人提出了更好的解决方案。

4

2 回答 2

2

没有内置方法可以隐藏发送到远程浏览器的击键,也没有将它们从测试框架日志中排除。从测试框架的角度来看,它们只是击键,而不是密码。

当然,处理这种情况的理想方法是使用目标应用程序的测试部署,这样既安全又允许对测试进行更多控制。假设这是不可能的,虽然......

在不记录密码的情况下将密码输入浏览器的一种可能性是让浏览器通过注入的脚本标签加载脚本,该标签将填写密码。基本上,您将有一个外部脚本来查找密码字段并输入值。在功能测试中,您需要将脚本标签注入浏览器,然后等待它加载,例如:

return this.remote
    .get(URL)
    .findById('username')
        .click()
        .pressKeys(USER.ADMIN.USERNAME)
        .end()
    .executeAsync(function (done) {
        window._intern_done = done;
        var script = document.createElement('script');
        script.src = '/path/to/password_script.js';
        document.head.appendChild(script);
    })
    .findByCssSelector('.login-welcome')
    // continue testing

脚本本身可能如下所示:

(function () {
    // set the password
    var passwordField = document.getElementById('password');
    passwordField.value = 'secret password';
    // clean up the _intern_done global we set in the executeAsync block
    var done = window._intern_done;
    delete window._intern_done;
    // let Intern know we're done
    done();
})();
于 2015-11-22T16:21:30.967 回答
0

Browserstack 有一个未列出的设置,您可以将其添加到您的功能中:

browserstack.maskSendKeys: true

所有输入都将在日志中被屏蔽。

https://github.com/DEFRA/quke/blob/master/.config.example.yml

于 2019-05-06T17:53:05.630 回答