wda error:invalid session id
本文最后更新于 2025年8月11日 凌晨
wda error: invalid session id
背景描述
WebDriverAgent是一个运行在ios手机端的web服务器,可用于控制ios设备,例如启动指定app,点击屏幕坐标,获取应用控件树等,该工具在ios自动化测试中常作为手机驱动使用。WebDriverAgent虽然功能齐全,被各大厂广泛使用,但bug也多,替代产品少,所以是众多测开同学逃不过的噩梦。在近期工作中,遇到一个问题:打开网页A时,正在运行测试中的设备会突然推出测试app,并报错:wda.exceptions.WDAInvalidSessionIdError。经过仔细分析,是wda建连session机制的特殊性所致,本篇文章对我的遇到的问题做一个分享,帮助大家排坑。
问题描述
在打开网页A(这是一个控制手机设备的网页)时,正在运行测试用例的ios手机B突然退出测试app,并出现报错:
1 | |
而查看ios手机的运行进程,发现wda(webdriveragent的简称)并没有退出,只是session断连了。但是为什么session会断连呢?并且session断连wda会退出测试app吗?带着这个疑问我进行了问题排查。
问题排查
首先说明这里的session是什么?session是指wda与测试代码在测试前通过wda的/session接口建立的一个session连接,其中wda是server端,测试代码是client端。有了这个session连接,我们才能调用wda的一些端口,例如截图手机,点击屏幕坐标等。为了弄明白上面两个问题,我们做了一个实验,验证了上面的第二个问题。实验代码如下:
1 | |
这个实验的内容是:
- 进程A先和wda建立session连接,并通过session启动微信应用。
- 进程A sleep 10秒
- 进程B立即与wda建立新的session连接,但不启动app。
- 等待进程A休眠结束,并再次启动微信app。
实验结果如下:
进程B在创建session后,进程A立马断连,并报错error: invalid session id。
实验结论:
说明wda只能建立单连session,并且session断连会退出通过session拉起的app。
确认了这个问题后,我们找到了网页A的开发同学,查看网页源码后,发现果然在打开网页A时会和手机上的wda建立新的session连接,所以导致了之前测试代码中的session失效,随即测试app退出的问题。
问题拓展
经过查看wda的源码发现,session失效会退出app这个特性是通过wda里的一个变量shouldTerminateApp控制的,该变量默认值为true。在调用/session接口时,可以通过传递capabilities参数(是一个dict变量),指定shouldTerminateApp项为false解决。但这样虽然app不退出,之前的session连接也是会失效的。