Selenium/PHPUnit中刷新页面为何会导致日期值出现随机异常?
问题成因
- 无效日期兜底逻辑:1901-12-13是32位Unix时间戳可表示的最小日期,当日期输入组件接收到无法解析的无效值时,会自动兜底返回该日期。
- 竞态条件导致随机触发:
refresh()执行后未等待页面完全加载、前端日期组件完成值回填和格式解析,就直接读取输入框的值。如果组件初始化进度慢于测试代码的执行速度,此时读取到的就是未初始化完成的无效值,触发兜底逻辑。 - 格式转换不稳定:赋值时使用
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
相关产品推荐
相关产品推荐

