【问题标题】:Hide password in functional tests using the Intern / LeadFoot / Selenium使用 Intern / LeadFoot / Selenium 在功能测试中隐藏密码
【发布时间】:2016-02-11 20:03:58
【问题描述】:

我使用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"]}

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

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

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

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

【问题讨论】:

    标签: functional-testing intern saucelabs browserstack leadfoot


    【解决方案1】:

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

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

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

    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();
    })();
    

    【讨论】:

    • 这看起来很有希望。有没有办法从本地机器加载脚本? IE。 script.src = 'http://localhost/path/to/password_script.js';.
    【解决方案2】:

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

    browserstack.maskSendKeys: true

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多