我试图做一个断言,将打印出警告横幅的文本上下文。仅当用户输入错误的登录信息时,横幅才可见。这是断言:
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会是虚假的
任何帮助将不胜感激。
答案 0 :(得分:4)
传递给.notOk()
函数的参数表达式总是在由Expect语句完成断言之前执行。
这意味着await login.alertMessage.innerText
总是在expect
语句之前执行。
当用户输入正确的登录信息时,TestCafe将不会找到alertMessage选择器,并将输出您提到的第一个错误。
移除await
关键字时,selector.innerText
是Promise<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)