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

Cypress测试问题:校验可用ABN时断言失败求助

解决Cypress校验可用编号的测试问题

问题出在哪

你的代码有两个关键问题:

  • 用了普通for循环和if(cy.get(...))的同步写法,但Cypress所有命令都是异步的,这种写法根本没法正确判断元素状态,而且cy.get('#mat-error-5')找不到元素时会直接让测试失败,不会走else分支。
  • 循环里没生成新的随机编号,一直用同一个randomTxt,就算当前编号不可用,重复输入也没用。

正确写法

用递归函数来处理重复尝试,最多试100次,每次生成新的随机编号,同步检查错误提示是否存在:

then(() => {
  // 递归函数:尝试找可用的ABN编号
  const tryFindValidABN = (attemptsLeft) => {
    if (attemptsLeft <= 0) {
      throw new Error('试了100次都没找到可用ABN,测试失败');
    }

    // 生成新的随机编号(这里换成你实际的生成规则)
    const randomTxt = Math.random().toString().slice(2, 11); // 示例:9位随机数

    cy.get('[data-cy="abn-input"]').clear().type(randomTxt);
    cy.get('[data-cy="search-button"]').click();

    // 检查错误提示是否存在
    cy.get('body').then($body => {
      if ($body.find('#mat-error-5').length > 0) {
        // 有错误提示,说明编号被占了,继续试
        tryFindValidABN(attemptsLeft - 1);
      } else {
        // 没错误提示,编号可用,结束
        cy.log(`找到可用ABN:${randomTxt}`);
      }
    });
  };

  // 开始尝试,最多100次
  tryFindValidABN(100);
});

代码说明

  1. 递归控制次数:用attemptsLeft追踪剩余尝试次数,每次失败就减1,次数用完就抛错。
  2. 每次生成新随机值:确保每次尝试的编号都不一样,不会做无用功。
  3. 同步检查DOM:用cy.get('body').then($body)来判断错误元素是否存在,避免Cypress因为找不到元素直接报错。
  4. 明确错误信息:100次都找不到的话,抛出清晰的错误提示,方便排查。

额外建议

  • 把随机编号生成逻辑换成符合业务要求的格式(比如ABN的规范),别随便生成。
  • 如果点击搜索后页面有加载,可以加cy.wait(500)或者等加载动画消失,再检查错误提示,避免判断过早。
  • 要是多个测试都要用这个逻辑,封装成Cypress自定义命令,代码更整洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:42:47