使用Intern / LeadFoot / Selenium在功能测试中隐藏密码

时间:2015-11-10 20:04:22

标签: functional-testing intern saucelabs browserstack leadfoot

我正在使用the Intern进行功能测试。一个这样的测试需要登录管理员帐户:

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"]}

问题在于这些测试的访问权限并未受到限制 - 这些测试需要由其他部门的人员查看。

即使没有这个,如果测试帐户的密码遭到破坏,我也不希望攻击者突然获得管理员访问其他所有内容。

有没有办法让密码不会在命令中以纯文本形式存储/显示?

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

2 个答案:

答案 0 :(得分: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();
})();

答案 1 :(得分:0)

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

browserstack.maskSendKeys: true

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

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