You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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$/);
    })()
  ]);
}

核心逻辑说明

  1. 并行任务设计:

    • 将waitForResponse与「点击按钮+处理登录+等待结账页」的流程放入Promise.all,实现并行等待,避免逻辑阻塞
    • 不管是直接跳转结账页,还是登录后跳转,都会触发/my-account/addressform的成功响应,因此这个等待逻辑能覆盖所有场景
  2. 自动处理登录场景:

    • 点击按钮后立即检查登录框是否可见,若存在则执行登录操作,无需提前判断用户状态
    • 登录完成后自动等待结账页URL,保证流程完整性
  3. 简化分支判断:

    • 移除原有的#isGuest分支,统一处理所有用户状态下的结账流程,代码更简洁通用

注意事项

  • 确保loginPage.login方法内部已处理登录后的页面跳转或必要的响应等待,避免与外部等待逻辑冲突
  • 若登录操作本身会触发/my-account/addressform接口,waitForResponse会捕获第一个符合条件的成功响应,不影响流程执行

内容的提问来源于stack exchange,提问作者mismas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:50:28