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

Codeception如何忽略特定错误类型并自动重新运行测试

Codeception特定异常自动重试配置方案

完全可以通过Codeception原生功能实现指定异常触发时自动重试测试,你提到的元素遮挡、元素过时这类由加载延迟导致的非功能故障异常,都支持设置自动重试规则。


1 全局统一重试配置

你可以在对应测试套件的配置文件(如acceptance.suite.yml)中配置Retry扩展,仅对指定异常开启重试:

actor: AcceptanceTester
extensions:
  enabled:
    - Codeception\Extension\Retry:
        retries: 2 # 最多重试2次,加上首次运行总共最多执行3次
        retry_only:
          # 你遇到的元素被遮挡异常
          - Facebook\WebDriver\Exception\ElementClickInterceptedException
          # 元素过时异常
          - Facebook\WebDriver\Exception\StaleElementReferenceException
          # 可按需添加其他非功能故障类异常,比如加载超时
          - Facebook\WebDriver\Exception\TimeoutException

该配置会全局生效,所有匹配到指定异常的失败用例都会自动重试,仅当最后一次重试仍然失败时,才会被判定为测试失败。


2 单个测试用例自定义重试

如果不需要全局生效,只想给特定容易出现加载异常的用例单独配置重试,可以直接在测试代码中设置:

Cept格式用例配置

<?php
$I = new AcceptanceTester($scenario);
$scenario->retry(2); // 单独给当前用例设置最多重试2次

$I->amOnPage('/test-page');
$I->click('#nav_step0');
// 其余测试逻辑

Cest格式用例配置

直接在测试方法的注解中添加@retry标签即可:

/**
 * @retry 2
 */
public function testNavigationStep(AcceptanceTester $I)
{
    $I->amOnPage('/test-page');
    $I->click('#nav_step0');
}

3 优化建议(降低重试触发概率)

针对你遇到的ajaxloading_mask遮罩层遮挡元素的问题,可以先增加等待逻辑,从根源减少异常出现的概率,提升测试运行效率:

// 点击前先等待遮罩层消失,最长等待5秒
$I->waitForElementNotVisible('#ajaxloading_mask', 5);
$I->click('#nav_step0');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:00:03