automated-tests - 在 TestCafe 中有一种方法可以重试导航到 URL 而无需等待
问题描述
我们的项目使用 TestCafe 进行 e2e 测试。由于导航到 URL 的环境间歇性失败(Ping 或其他问题)。testCafe 隔离模式不是正确的解决方案,因为一次成功就表示成功。我正在尝试为自动脚本编写一个解决方案,以便在未加载正确的 URL 时重试。我想实现类似这样的期望语句,而不是“期望”导致测试失败或使用硬 .wait(30000)
await t.expect(getLocation()).contains('/page', { timeout: 30000});
test('Should login and navigate to desired URL', async t => {
console.log('Login Page');
await login.login('userName', 'password', '/page');
for (let i = 0; i < 3; i++) {
await t.wait(30000);
url = await getUrl();
if (!url.includes('/page')) {
console.log('Retrying Login ' + (i + 1) + ' of 3');
await login.login('userName', 'password', '/page);
// there is a delay before the page loads
// .wait(30000); <== trying to avoid this if possible
// await t.expect(getLocation()).contains('/page', { timeout: 30000}); <== would prefer something like this without the causing a test failure
url = await getUrl();
} else {
console.log('Login Valid');
i = 3;
}
}
console.log('Location Page');
await t.expect(getLocation()).contains('/page', { timeout: 30000});
// ... script continues...
//---------------------------
export async function getUrl() {
const getLocation = ClientFunction(() => document.location.href);
const url = getLocation();
return url;
}
async login(username: string, password: string, endpoint: string) {
let url = await setUrl(environment);
url = url + endpoint;
console.log(url);
await t
.wait(5000)
.navigateTo(url)
.expect(this.userName.exists).ok('username field exists', {timeout: 20000})
.expect(this.userName.hasAttribute( 'disabled')).notOk('username field enabled', {timeout: 20000})
.hover(this.userName)
.typeText(this.userName, username)
// ----
.expect(this.password.exists).ok('password field exists', {timeout: 2000})
.expect(this.password.hasAttribute( 'disabled')).notOk('username field enabled', {timeout: 2000})
.hover(this.password)
.typeText(this.password, password)
// ----
.expect(this.submitBtn.exists).ok('submit button field exists', {timeout: 2000})
.expect(this.submitBtn.hasAttribute( 'disabled')).notOk('username field enabled', {timeout: 2000})
.hover(this.submitBtn)
.click(this.submitBtn);
}
所需的解决方案将在失败之前重试登录功能 3 次。
解决方案
为了避免调用该login
方法后的硬等待,一种解决方案可能是在该 login
方法中添加以下断言:
await t
.expect(this.submitBtn.exists).notOk({timeout: 30000});
for (let i = 0; i < 30 ; i++) {
await t.wait(1000);
url = await getUrl();
if (url.includes(endpoint)) {
return;
}
}
所以你的主循环更简单:
for (let i = 0; i < 3; i++) {
url = await getUrl();
if (url.includes('/page')) {
console.log(`Login Valid at step ${i}`);
break;
}
console.log(`Login Invalid at step ${i}, retrying ...`);
await login.login('userName', 'password', '/page);
}
推荐阅读
- c# - 在本地 IIS windows 10 上托管 ASP CORE 2.1
- python - Keras 中的 EarlyStopping 是否保存了最佳模型?
- php - AngularJS 检索在控制器中的刀片处初始化的数据
- java - 使用 GridBagLayout 在 JPanel 中居中组件
- x86 - 当线程可能切换内核时,如何正确使用 TSX-NI(HLE 和 RTM)?
- c# - 生成子列表
- apache-flink - 如何加入两个流式 Flink 表并保留时间戳信息
- java - 如何使用 Java 使 Edge 的会话无效?
- junit - java.lang.AssertionError:JSON 路径期望不同的结果
- python - 如何将 .py 编译为 .dll