如何使用testcafe打印promise的内部文本?

时间:2019-02-24 04:33:24

标签: javascript automated-tests e2e-testing testcafe

我试图做一个断言,将打印出警告横幅的文本上下文。仅当用户输入错误的登录信息时,横幅才可见。这是断言:

await t
    .expect(login.alertMessage.exists)
    .notOk(
        "I don't see the user details page. I see this " +
        await login.alertMessage.innerText 

    );

如果他输入了错误的信息,则断言将始终通过。

如果我进行否定测试(意味着如果用户输入正确的登录信息),则声明将在以下行上失败:await login.alertMessage.innerText,错误消息为

1)无法获得有关节点的信息,因为指定的选择器与DOM树中的任何节点都不匹配。

如果我删除了 await login.alertMessage.innerText 中的 await ,则断言不会显示横幅的内部文本。相反,我看到

1)AssertionError:我看不到用户详细信息页面。我看到了这个:{“ _then”:[],“ _ taskPromise”:null}:预期为true会是虚假的

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

传递给.notOk()函数的参数表达式总是在由Expect语句完成断言之前执行。

这意味着await login.alertMessage.innerText总是在expect语句之前执行。

当用户输入正确的登录信息时,TestCafe将不会找到alertMessage选择器,并将输出您提到的第一个错误。

移除await关键字时,selector.innerTextPromise<string>;将此Promise与字符串连接起来将在Promise上调用toString()方法,但不会解决Promise本身。

您应该像这样重写您的Expect语句:

const alertMessage = login.alertMessage;
if (await alertMessage.exists) {
    throw new Error(`user cannot login: ${await alertMessage.innerText}`);
}

但是,这样做可能会遇到另一个问题:警报弹出框可能要花一些时间才能出现在DOM中,并且可能会在if语句执行后出现,并且当用户无法登录时,您会得到误报。

>

为防止这种情况,必须在输入if语句之前实现自己的等待机制。 一种解决方案是:

const alertMessage = login.alertMessage;
await t.wait(5000);
if (await alertMessage.exists) {
    throw new Error(`user cannot login: ${await alertMessage.innerText}`);
}

您还可以使用here所述的更复杂的方法替换await t.wait(5000)