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

Selenium/PHPUnit中刷新页面为何会导致日期值出现随机异常?

问题成因

  1. 无效日期兜底逻辑:1901-12-13是32位Unix时间戳可表示的最小日期,当日期输入组件接收到无法解析的无效值时,会自动兜底返回该日期。
  2. 竞态条件导致随机触发:refresh()执行后未等待页面完全加载、前端日期组件完成值回填和格式解析,就直接读取输入框的值。如果组件初始化进度慢于测试代码的执行速度,此时读取到的就是未初始化完成的无效值,触发兜底逻辑。
  3. 格式转换不稳定:赋值时使用mdY(月日年)格式传值,而组件输出使用Y-m-d格式,部分日期组件对自定义输入格式的解析逻辑存在兼容问题,偶尔会出现赋值后内部值未正确同步的情况,刷新后直接丢失正确值。

解决方法

1. 赋值后增加同步等待,刷新前确保值已被正确接收

$date=strtotime("+ 7 days");
$inputDate = date("mdY", $date);
$outputDate = date("Y-m-d", $date); 

$this->byId('template_settings_date_end')->value($inputDate);
// 显式等待2秒,直到输入框确认收到赋值后再刷新
$this->waitUntil(function($testCase) use ($inputDate) {
    return $testCase->byId('template_settings_date_end')->value() === $inputDate;
}, 2000);

$this->refresh();

2. 刷新后增加等待,避免读取未初始化的值

// 刷新后最多等待3秒,直到输入框值不是无效兜底值再做断言
$this->waitUntil(function($testCase) {
    $currentVal = $testCase->byId('template_settings_date_end')->value();
    return $currentVal !== '' && $currentVal !== '1901-12-13';
}, 3000);

$this->assertEquals($outputDate, $this->byId('template_settings_date_end')->value());

3. 可选优化:跳过格式转换直接赋值

如果前端组件支持直接写入标准日期格式,可通过JS直接操作DOM赋值,避免前端格式转换带来的不稳定问题:

$date=strtotime("+ 7 days");
$outputDate = date("Y-m-d", $date); 

// 直接写入标准Y-m-d格式值
$this->execute([
    'script' => "document.getElementById('template_settings_date_end').value = '$outputDate'",
    'args' => []
]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:24:03