升级至ChromeDriver 89后alert弹窗快速消失,Serenity自动化测试接受弹窗失败原因咨询
ChromeDriver 89 版本下Alert弹窗自动消失的原因与对应解法
核心原因
这个问题不是Serenity框架或者测试代码的bug,根源是ChromeDriver v88之后的默认弹窗处理逻辑变更:
- 你之前使用的ChromeDriver 2.36版本,默认对未处理的模态弹窗(alert/confirm/prompt)采用
ignore策略:一旦页面弹出弹窗,会直接暂停页面所有JS执行,弹窗会一直驻留直到WebDriver脚本主动发起accept/dismiss操作,流程天然顺畅,不会出现识别不到的问题。 - ChromeDriver 89版本开始,为了对齐最新的W3C WebDriver规范,把未处理弹窗的默认行为改成了
dismissAndNotify:弹窗弹出后,驱动只会留300~500ms的等待窗口等脚本处理,超时就会自动关掉弹窗。这个等待窗口远小于Selenium/Serenity框架常规的弹窗轮询识别耗时,就会出现你遇到的“弹窗一闪就没,脚本没抓到”的情况。
实际验证有效的解决方式
- 第一优先级:修改ChromeDriver的启动配置,把弹窗处理逻辑改回旧版行为
在Serenity的Chrome能力配置(比如项目内的serenity.conf配置文件)中,显式指定弹窗处理参数,覆盖驱动默认值:
这个参数生效后,驱动就不会自动关闭任何未处理的弹窗,行为和你之前使用的2.36版本完全一致。webdriver.capabilities.chromeOptions.unhandledPromptBehavior = "ignore" - 第二优先级:优化弹窗操作的稳定性(作为兜底防护)
不要触发弹窗后直接调用as(actor).getAlert().accept(),最好先加显式等待确认弹窗加载完成再操作,避免偶发时序问题:// 先执行触发alert的业务步骤 actor.attemptsTo(/* 原有触发弹窗的操作 */); // 最多等3秒直到alert存在,再执行accept操作 SerenityWaitableWaiter.waitForCondition().until(ExpectedConditions.alertIsPresent()); actor.getAlert().accept();
容易踩的排查误区
- 不要靠加长脚本等待时间解决问题:如果没改驱动的默认弹窗配置,等待逻辑还没触发,弹窗就已经被驱动自动关掉了,等再久也没有效果。
- 不需要回退ChromeDriver版本:只需要调整上述启动参数,就能完全对齐旧版的弹窗交互逻辑,不用牺牲高版本驱动的稳定性和性能。
内容的提问来源于stack exchange,提问作者mrjcohen
相关产品推荐
相关产品推荐

