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
wda.exceptions.WDAInvalidSessionIdError: WDARequestError(status=110, value={'error': 'invalid session id', 'message': 'Session does not exist'})

而查看ios手机的运行进程,发现wda(webdriveragent的简称)并没有退出,只是session断连了。但是为什么session会断连呢?并且session断连wda会退出测试app吗?带着这个疑问我进行了问题排查。

问题排查

首先说明这里的session是什么?session是指wda与测试代码在测试前通过wda的/session接口建立的一个session连接,其中wda是server端,测试代码是client端。有了这个session连接,我们才能调用wda的一些端口,例如截图手机,点击屏幕坐标等。为了弄明白上面两个问题,我们做了一个实验,验证了上面的第二个问题。实验代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# -*- coding: utf-8 -*-
import time
# 通过pip3 install facebook-wda安装
import wda

bundle_id = "com.tencent.xin"
udid = "xxxxx"


def sessionA():
# 使用client建立的session,微信也会退出
# session_a = wda.Client(url="http://127.0.0.1:8100").session(bundle_id)
# 使用wda.USBClient建立的session,微信会退出
session_a = wda.USBClient(udid=udid).session(bundle_id)
print(session_a.session_id)
session_a.app_start(bundle_id)
time.sleep(10)
session_a.app_start(bundle_id)
print(session_a.session_id)


def sessionB():
session_b = wda.USBClient(udid=udid).session()
print(session_b.session_id)


if __name__ == '__main__':
# 先执行A
sessionA()
# 注释掉A,再执行B
# sessionB()

这个实验的内容是:

  1. 进程A先和wda建立session连接,并通过session启动微信应用。
  2. 进程A sleep 10秒
  3. 进程B立即与wda建立新的session连接,但不启动app。
  4. 等待进程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连接也是会失效的。


wda error:invalid session id
https://quxing9.github.io/2025/08/10/wda-error-invalid-session-id/
作者
xxing
发布于
2025年8月10日
许可协议