TestCafe 1.8.0,Firefox 76.0(任何人都可以),macOS 10.15.4。
我的TestCafe测试(在useRole之后的步骤)甚至在useRole尚未完全完成之前仍在尝试执行。示例:
import { Role } from 'testcafe';
const role = Role('http://example.com/login', async t => {
await t
.typeText('#login', 'username')
.typeText('#password', 'password')
.click('#sign-in'); // Redirects to http://example.com/session
});
fixture `My Fixture`;
test('My test', async t => {
await t
.navigateTo('http://example.com/')
.useRole(role);
.click()
.typeText('#search', 'query')
// Further tests.
.......
http://example.com/session
。My test
并且它再次重新加载http://example.com/
。这是一个巨大的问题,因为在此页面之间重新加载了片刻的时间,并且'TestCafe正在快速工作.click()
。现在页面重新加载,因此测试执行停止。页面加载后,测试制动器会刹车,因为它试图在没有.typeText(...)
的情况下尝试.click()
。
尝试此解决方案:
.expect(getUrl()).eql('desiredurl', { timeout: 10000 })
.wait(3000)
或减慢测试.setTestSpeed(0.7)
都可以,但是从代码角度来看,这不是一个好的解决方案。测试仍然可能会不时失败,因此我需要并希望稳定性。{ preserveUrl: true }
,它只会重新加载http://example.com/session
,因此,使用此选项并不重要。重新加载仍在发生。有什么想法吗?如何让我的测试知道等待完全相同的页面重新加载,而无需使用任何硬编码的等待和代码睡眠?
据我了解,主要问题是出于某些原因在错误的页面上执行了click
操作。它不会等到页面完全重新加载。此行为是意外的。如果您创建可重现的样本,我们将不胜感激。
我同意使用wait
或setTestSpeed
是不合适的解决方案。
[我看到您尝试使用断言:.expect(getUrl()).eql('desiredurl', { timeout: 10000 })
。我认为这种方法应该可行,但是我不能确定,因为我无法重现该问题。
您可以使用preserveUrl: true
定义您的角色。然后,提取useRole
方法,如下所示:
async function useRole (t, role) {
await t.useRole(role);
await t.expect(getUrl()).eql('http://example.com/session', {timeout: 10000 });
}
现在,您可以使用新的useRole(t, role)
方法,该方法将等待页面完全加载。