WebdriverIO关闭弹窗后焦点未返回浏览器 执行中断报错问题
WebdriverIO自动化测试弹窗关闭后流程中断、内存溢出问题
复现场景
测试执行流程如下:
- 登录页输入正确的用户名、密码
- 点击提交按钮,等待页面弹出弹窗后,在弹窗输入框录入指定数据,点击弹窗OK按钮
- 弹窗自动关闭,页面触发跳转加载全新页面
- 预期执行:校验新页面上的指定业务元素
故障现象
- 流程执行到第3步(弹窗关闭)后停滞,无法定位新页面上的任何元素
- 已尝试的修复手段均无效:主动获取切换浏览器句柄、添加
waitUntil显式等待逻辑、调用browser.getUrl()获取当前页面地址 - 停滞一段时间后控制台抛出
JavaScript heap out of memory内存溢出错误 - 调试阶段捕获明确异常:
Session closed/target window is already closed,未定位到异常触发点
环境信息
- Node.js 版本:12.x
- 自动化测试框架:WebdriverIO 6.4.0
- 测试浏览器:Chrome 100.0.4896
根因与修复方案
- 高概率根因:版本兼容性不匹配
- WebdriverIO 6.4.0发布周期适配的Chrome最高版本为89及以下,当前使用的Chrome 100版本与WDIO6内置的ChromeDriver、WebDriver协议实现存在兼容bug,会导致窗口会话上下文识别错误,在页面跳转时误判窗口已关闭,主动销毁会话。
- 修复方式:二选一即可
- 保留WDIO6.4.0版本:将Chrome降级至85-89版本区间,保证浏览器版本和WDIO内置驱动版本对齐
- 保留Chrome 100版本:将WDIO升级至7.20及以上版本,同时安装100.x版本对应ChromeDriver,保证框架、驱动、浏览器三者版本严格匹配
- 弹窗处理逻辑错误
- 如果点击提交后弹出的是浏览器原生
alert/confirm/prompt弹窗,不能通过普通元素定位的方式点击OK按钮,错误的点击逻辑会打乱浏览器会话上下文,触发窗口关闭异常。 - 校验修复:弹窗出现时先调用
browser.getAlertText(),如果能正常返回弹窗文本,说明是原生弹窗,直接调用browser.acceptAlert()方法完成确认操作,不要走元素定位点击逻辑。
- 如果点击提交后弹出的是浏览器原生
- 句柄切换时机错误
- 如果点击OK后是打开新标签页而非当前页跳转,不要在点击OK后立刻获取窗口句柄,需先等待
browser.getWindowHandles()返回的数组长度大于操作前的窗口数量,确认新窗口句柄已经生成后再执行切换,否则会拿到过期的窗口上下文,触发会话不存在的异常。
- 如果点击OK后是打开新标签页而非当前页跳转,不要在点击OK后立刻获取窗口句柄,需先等待
- 内存溢出为连带故障
- 抛出
JavaScript heap out of memory是会话丢失后的连带现象:WDIO在会话异常关闭后,默认轮询逻辑不会校验会话存活状态,会持续生成等待任务堆积在内存中,最终触发堆内存溢出,修复前面的核心问题后该报错会自动消失,不需要单独调整Node运行内存参数。
- 抛出
内容的提问来源于stack exchange,提问作者Testing
相关产品推荐
相关产品推荐

