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); });
代码说明
- 递归控制次数:用
attemptsLeft追踪剩余尝试次数,每次失败就减1,次数用完就抛错。 - 每次生成新随机值:确保每次尝试的编号都不一样,不会做无用功。
- 同步检查DOM:用
cy.get('body').then($body)来判断错误元素是否存在,避免Cypress因为找不到元素直接报错。 - 明确错误信息:100次都找不到的话,抛出清晰的错误提示,方便排查。
额外建议
- 把随机编号生成逻辑换成符合业务要求的格式(比如ABN的规范),别随便生成。
- 如果点击搜索后页面有加载,可以加
cy.wait(500)或者等加载动画消失,再检查错误提示,避免判断过早。 - 要是多个测试都要用这个逻辑,封装成Cypress自定义命令,代码更整洁。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

