Выражение параметра, которое вы передаете в функцию .notOk()
, всегда выполняется до того, как утверждение выполнено оператором ожидаемого.
Это означает, что await login.alertMessage.innerText
всегда выполняется перед оператором expect
.
Когда пользователь вводит правильную информацию для входа, TestCafe не найдет селектор alertMessage и выдаст первую ошибку, о которой вы упомянули.
При удалении ключевого слова await
, selector.innerText
- этоа Promise<string>
;конкатенация этого Promise со строкой вызовет метод toString () в Promise, но не разрешит само обещание.
Вы должны переписать ваше ожидание следующим образом:
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}`);
}
Вы также можете заменить await t.wait(5000)
на более сложный подход, как объяснено здесь