Testcafe如何处理登录错误?

时间:2019-07-09 08:50:54

标签: javascript authentication automated-tests e2e-testing testcafe

我正在测试一个需要与其他用户进行身份验证的网站。它大部分时间都在工作,但有时登录失败,并且在进入实际的测试代码之前,Testcafé不会检测到它。在测试页中找到DOM元素时,它不会失败,而不会在登录方法中引发错误。因此,它会保留错误的登录信息,并且同一用户的其他测试也会失败。

我知道在我的网站上检测到登录错误的方法,但是我无法对Testcafé说:

“嘿!登录时会出现错误,请不要为此用户保存登录信息,然后在下一个测试中重试”

编辑: 我不使用硬编码的登录信息,而是使用具有以下结构的单独文件logins.ts,并将其修改为添加loggedInrole字段:

adminUserCredentials: { login: 'mylogin', pwd: 'mypass', role: null, loggedIn: false }

然后我按如下方式使用它:

function createUserForSpecificEnv(user: User, baseUrl: string): Role {
    if(!user.loggedIn) {
        user.role = Role(baseUrl, async t => {
            await t
                .wait(1000)
                .typeText('#loginInput', user.login)
                .typeText('#passwordInput', user.pwd)
                .click('#Btn')

            if(await Selector('#user-info').visible) {
                user.loggedIn = true
            }
        })
    }
    return user.role
}

const adminUserRole = getRole(adminUserCredentials)

test("test 1", async t => {
    t.useRole(adminUserRole)
}) // The test go on the login page, auth failed (expected) and can't find #user-info (expected)

test("test 2", async t => {
    t.useRole(adminUserRole)
}) // The test doesn't go to the login page and directly says : can't find #user-info

但是它仍然无法正常工作... Testcafe尝试登录第一个测试,然后直接重用相同的登录信息。

任何帮助将不胜感激!谢谢:-)

编辑2 我澄清了一个事实,我使用变量来存储角色(请参见注释)

2 个答案:

答案 0 :(得分:3)

如果预计登录失败,则建议不要为此特定测试使用Role。您可以将身份验证登录提取到单独的函数中,并直接在此测试中和Role构造函数中使用它:

const logIn = async t => {
    //login steps
};

user.role = Role(baseUrl, logIn);

test("test 1", async t => {
    await logIn(t);    
}); // The test go on the login page, auth failed (expected) and can't find #user-info (expected)

test("test 2", async t => {
    t.useRole(adminUserRole)
});

答案 1 :(得分:2)

我认为您可以在“角色初始化”的最后一步上检查一些选择器,以确保您正确登录。如果未正确登录,则需要重新创建角色以在以后的测试中进一步使用。请参见以下代码,该代码演示了我的想法:

import { Role, Selector } from 'testcafe';

let role     = null;
let loggedIn = false;

function getRole() {
    if (!loggedIn) {
        role = new Role('http://example.com', async t => {
            console.log('role initialize');

            // await t.typeText('#login', 'login');
            // await t.typeText('#password', 'password');
            // await t.click('#signin');

            // NOTE: ensure that we are actually logged in
            if(await Selector('#user_profile').exists)
                loggedIn = true;
        });
    }

    return role;
}

fixture `fixture`
    .page `../pages/index.html`;

test(`test1`, async t => {
    await t.useRole(getRole());
});

test(`test2`, async t => {
    await t.useRole(getRole());
});

test(`test3`, async t => {
    await t.useRole(getRole());
});