Karate测试中子页面自关闭后无法切换回父页面问题
Karate Feature 多窗口切换超时异常解决方案
问题复现场景
执行以下测试流程时,固定触发无响应的timeout exception(超时异常):
- 打开父页面
- 点击可打开新页面的超链接
- 切换到新打开的子页面
- 点击触发子页面自关闭的超链接
- 尝试切换回原父页面
问题根因
Karate 驱动默认会缓存操作时获取的窗口句柄列表,子页面通过脚本触发自关闭时,浏览器驱动侧的存活窗口句柄列表不会自动同步更新,此时直接调用窗口切换API,会优先尝试访问已销毁的子页面句柄做合法性校验,直接导致请求挂起触发超时。
修复步骤
- 点击子页面的自关闭按钮后,不要立刻执行窗口切换操作,先加轮询判断等待存活窗口数量回归到父页面单窗口的预期值,强制驱动刷新句柄列表,示例代码:
# 点击触发子页面关闭的元素 click('关闭按钮定位表达式') # 轮询等待窗口列表只剩1个(即父页面),轮询超时时间可根据项目配置调整 waitFor(function(){ return driver.windowHandles.size() === 1 })
- 等待条件满足后,再执行父页面切换操作,不要使用之前缓存的窗口句柄ID做切换参数,改用父页面的URL、标题特征匹配:
# 示例:通过父页面标题匹配切换 switchWindow({ title: '父页面标题关键词' })
避坑提示:子页面自关闭场景下,提前缓存的窗口句柄ID会全部失效,必须等句柄列表刷新完成后再做切换,否则会持续触发句柄不存在的超时错误。
如果按上述步骤调整后仍存在超时问题,可以提供对应feature文件的窗口操作代码片段、使用的Karate版本、浏览器及驱动版本做进一步排查。
内容的提问来源于stack exchange,提问作者Umesh Kamat
相关产品推荐
相关产品推荐

