如何在Playwright的Promise.all中添加重复登录场景的条件处理?
Playwright购物车结账测试:整合两种场景的响应等待逻辑
需求背景
需要覆盖购物车点击CHECKOUT按钮的两种场景:
- 正常登录状态:直接跳转至结账页
- 存在应用bug:已登录状态下仍被要求重新登录
无论哪种场景,都需要等待/my-account/addressform接口的成功响应,同时将逻辑整合到Promise.all中。
优化后的实现代码
async clickCheckoutBtn(username, password, loginPage) { await Promise.all([ // 全局等待地址表单接口的成功响应,覆盖两种场景 this.page.waitForResponse( (response) => response.url().includes('/my-account/addressform') && response.status() === ResponseCode.SUCCESS ), // 封装点击后的流程:点击按钮 → 处理可能的登录 → 等待结账页 (async () => { await this.#checkoutBtn.click(); // 检测是否出现登录框,触发bug时执行登录 if (await this.page.getByPlaceholder('login').isVisible()) { await loginPage.login(username, password); } // 最终等待结账页加载完成 await this.page.waitForURL(/.*\/delivery-address\/add$/); })() ]); }
核心逻辑说明
并行任务设计:
- 将
waitForResponse与「点击按钮+处理登录+等待结账页」的流程放入Promise.all,实现并行等待,避免逻辑阻塞 - 不管是直接跳转结账页,还是登录后跳转,都会触发
/my-account/addressform的成功响应,因此这个等待逻辑能覆盖所有场景
- 将
自动处理登录场景:
- 点击按钮后立即检查登录框是否可见,若存在则执行登录操作,无需提前判断用户状态
- 登录完成后自动等待结账页URL,保证流程完整性
简化分支判断:
- 移除原有的
#isGuest分支,统一处理所有用户状态下的结账流程,代码更简洁通用
- 移除原有的
注意事项
- 确保
loginPage.login方法内部已处理登录后的页面跳转或必要的响应等待,避免与外部等待逻辑冲突 - 若登录操作本身会触发
/my-account/addressform接口,waitForResponse会捕获第一个符合条件的成功响应,不影响流程执行
内容的提问来源于stack exchange,提问作者mismas
相关产品推荐
相关产品推荐

