
很多团队手里只有Windows开发机却要负责iOS自动化测试第一个绕不开的点就是WDA。WDA全称WebDriverAgent是Appium在iOS端执行自动化的核心服务可以把它理解成给iPhone装了一个“遥控器”Appium正是通过它去点击、滑动、读取页面元素。可问题是WDA这东西的构建离不开Xcode而Xcode只存在于macOS里所以“Windows启动iOS 17/18的WDA”这句话听起来就像个悖论。我在实际项目里卡了这一关很久这篇就把Windows环境下准备、构建、启动、连上WDA的完整路径拆开讲清楚尤其是iOS 17/18带来的新坑希望能帮做iOS自动化的小伙伴少走弯路。1. 先拆清楚Windows跑WDA到底是怎么回事1.1 WDA的运行机制以及它和Windows的关系要理解这个标题先得知道WDA不是Windows程序而是一个运行在iOS设备上的单元测试Runner。它基于苹果的XCUITest框架在真机或模拟器上以测试App的形式存在启动后会开启一个HTTP服务默认监听8100端口。Appium客户端通过这个HTTP服务发送WebDriver协议指令比如查找元素、点击、滑动、获取源码WDA再把指令转换成XCUITest的调用去操作系统UI。很多首次接触的人会误以为WDA像Appium Server一样跑在电脑上其实完全不是。它跑在iPhone本机电脑只是一个控制端。正因为这样Windows并不是不能“玩”WDA而是不能完成WDA的编译和签名安装环节。编译需要Xcode签名需要Apple证书这两步必须在macOS上做。Windows这边实际承担的是“连接已经装好的WDA并驱动它工作”的角色。我们项目的落地姿势很典型一台Mac负责构建WDA并部署到真机Windows作为日常开发机和测试执行机Appium跑在Windows上通过webDriverAgentUrl直接连接iPhone上已运行的WDA。这样既绕开了Windows无法编译Xcode项目的问题又能让团队里没有Mac的同事正常写用例、跑测试。这也是市面上绝大多数团队在Windows上做iOS自动化的主流方案。1.2 两种“Windows启动WDA”的真实形态根据环境不同实际操作中有两种形态。第一种也是最推荐的做法WDA已经在Mac上构建好并手动启动iPhone屏幕上会出现WebDriverAgentRunnerWindows端用Appium发起连接。第二种团队有远程Mac构建机Windows通过SSH触发远端构建和启动再用端口转发把设备的8100端口映射到Windows本地。两种方式的核心都一样WDA始终跑在手机上Windows只是以外部请求的方式“唤醒”和“指挥”它。我见过不少人一上来就想在Windows里直接装一套“WDA工具包”这是不现实的。Xcode本身依赖macOS的多个系统框架Windows模拟不了。有折腾的时间不如把Mac构建这一步固化成脚本Windows只做自己擅长的事。当然如果你的构建机只有Windows也可以考虑云服务或借用同事的Mac先产出可用的WDA包后续日常测试完全可以在Windows上完成。1.3 iOS 17/18针对WDA的重点变化iOS 17和iOS 18对WDA的部署方式影响很大。首先是从iOS 16开始引入的“开发者模式”设备升级到iOS 17/18后如果不开启开发者模式Xcode和WDA都会反馈设备不支持。这个开关藏得比较深第一次用的时候很容易忽略。其次是证书信任流程。WDA是以开发者App形式安装到真机上的iOS 17/18对这类App的校验更严格。安装完WDA后必须在“设置 - 通用 - 描述文件与设备管理”里找到对应的开发者证书并手动信任否则连接时直接报错。再有就是Xcode版本匹配问题想跑iOS 17Xcode至少是15.x想跑iOS 18Xcode至少是16.x。版本不匹配会在部署阶段报“device does not support this version of Xcode”之类的错误。这几个点构成了iOS 17/18下WDA启动的第一批坑。2. 环境准备与前置条件2.1 Windows端需要安装的工具清单既然Windows是控制端工具链相对简单但版本和搭配还是有讲究的。我建议按下面这张表准备工具版本建议用途WindowsWindows 10/11 64位日常测试机Node.js18 LTS或更高运行AppiumAppium2.x测试服务端appium-xcuitest-driver最新版处理iOS自动化协议iTunes最新版安装苹果设备USB驱动Appium Inspector可选查看元素、调试会话libimobiledevice工具可选端口转发、设备信息查询Node.js的安装比较基础建议直接去官网下载LTS版安装时勾选自动加入PATH。装完之后在命令行里跑node -v确认一下。Appium 2.x按模块化方式管理驱动不再像1.x那样依赖内置driver所以后面需要单独执行命令安装xcuitest驱动。iTunes这个名字可能有人觉得多余但在Windows上折腾iOS设备它几乎是必需的。即使你不用iTunes只要安装了它苹果的Apple Mobile Device USB驱动就会一并装上Windows才能正常识别iPhone。如果你安装了新版iTunes还是识别不到再去设备管理器看重装驱动这个后面排查部分会展开说。2.2 iOS设备端与签名相关的准备工作在动手构建WDA之前先确认手头有条件一台iPhone或iPad系统处于iOS 17/18一条能传数据的原装或MFi认证USB线一个Apple ID如果是付费开发者账号更好免费账号也够用但有时间限制。签名这块是整个流程里最容易卡住的地方尤其是第一次做的人。免费个人Apple ID签出来的App只有7天有效期到期后WDA会直接无法运行需要重新用Mac安装一遍。付费开发者账号是365天有效适合长时间跑自动化。如果你只是短期调试免费账号可以先顶上如果是团队长期维护最好还是注册付费开发者账号省得每周都在签名这事上折腾。另外设备UDID也要提前准备好。把iPhone用数据线连到Mac上打开Finder或Xcode的Devices面板就能看到UDID也可以在Windows上用idevice_id -l之类的命令取到。UDID不仅签名要用后面写Desired Capabilities也要用务必先记录下来。2.3 为什么必须有一台Mac能不能省略这个问题被问了太多次有没有办法完全绕开Mac答案很遗憾到目前为止构建WDA必须经过Xcode。Xcode里有签名工具、编译链和模拟器运行时这些不是Windows可以替代的。市面上有一些云Mac服务可以把构建WDA这一步放到云端执行但本质还是用Mac环境。如果你手里只有Windows又想验证整个流程可以找同事借一台Mac用十几分钟拉取WDA源码改Bundle ID选择自己的iPhone点一次Run让WDA先跑起来。之后这台iPhone只要不重启、不杀掉WDA进程Windows端就能持续连着用。后面章节我会把Mac上这次性构建的步骤写出来目的是让你知道整个过程不复杂一次搞定后Windows才是主战场。3. 实操从零启动WDA并让Windows连上3.1 在Mac上完成一次WDA构建与安装很多人对Mac操作不熟别慌整个过程核心就四步拉代码、改签名、选真机、Run。打开macOS的终端先拉取WDA源码git clone https://github.com/appium/WebDriverAgent.git cd WebDriverAgent open WebDriverAgent.xcodeprojXcode打开工程后在左侧目录里找到WebDriverAgentRunner这个target。在TARGETS下选择Runner切到Signing Capabilities标签页勾选“Automatically manage signing”把Team选成你自己的Apple ID。如果之前没有添加Apple IDXcode会提示你登录。这里有个细节必须处理好Bundle Identifier需要改成唯一的值。默认的Bundle ID在多台设备或多人共用时容易冲突签名也会报错。可以改成com.yourname.WebDriverAgentRunner这种格式后缀别动前缀换成你自己的域名反写即可。改完之后确认没有报红否则先解决签名问题。接下来选择真机在Xcode顶部的设备选择器里选中你的iPhone然后点击Run按钮。第一次运行会有几个弹窗一个请求访问钥匙串签名选“允许”手机上提示“信任此电脑”也要点信任。等待进度条走完不要断电不要拔出USB线。跑通后Xcode控制台会打印类似这样的信息WebDriverAgentRunner is running at http://192.168.x.x:8100看到这个地址就意味着WDA已经在手机上启动成功了。此时手机屏幕会变成一个空白的自动化界面不要手动杀掉它也不要让iPhone锁屏太久否则进程可能会被系统回收。3.2 Windows端安装并配置Appium环境Mac那边把WDA跑起来后Windows这边的环境配置就轻松多了。打开一个普通权限的命令行窗口依次执行node -v npm install -g appium appium driver install xcuitest appium --version如果npm install -g遇到权限错误不要直接换管理员终端先检查Node.js安装目录的写权限或者用npm config set prefix重置全局安装路径。这里有个经验在Windows上让Appium和Node工具跑在普通终端比跑在管理员终端更省心很多莫名奇妙的文件权限报错能在第一步就避免。安装完成后启动Appium Serverappium --address 0.0.0.0 --port 4723启动成功会看到Appium的欢迎日志以及监听4723端口的提示。这个Serveer是整个自动化会话的入口后续测试框架通过这个端口发起连接。3.3 通过Capabilities让Windows连上手机里的WDAAppium启动后关键一步是配置Desired Capabilities。网上很多示例会省略webDriverAgentUrl但在Windows场景下这个参数几乎是必须的。因为它告诉AppiumWDA已经跑起来了我直接连这个地址不要再尝试重新构建或启动WDA。我的实际配置可以参考下面这份JSON{ platformName: iOS, platformVersion: 17.5, deviceName: iPhone, udid: 00008110-xxxxxxxx, automationName: XCUITest, webDriverAgentUrl: http://192.168.31.88:8100, bundleId: com.example.app, noReset: true }如果你是iOS 18设备把platformVersion改成对应的系统版本号例如18.1。udid一定要和真机一致bundleId换成你要测的App的Bundle ID。webDriverAgentUrl填WDA在设备上显示的局域网地址。如果你用的是Python代码里可以这样传from appium import webdriver caps { platformName: iOS, platformVersion: 17.5, deviceName: iPhone, udid: 00008110-xxxxxxxx, automationName: XCUITest, webDriverAgentUrl: http://192.168.31.88:8100, bundleId: com.example.app, noReset: True, } driver webdriver.Remote(http://127.0.0.1:4723/wd/hub, caps) print(driver.page_source)执行这段代码后Appium会向WDA发起会话创建请求。如果一切正常WDA会打开目标App并返回页面结构控制台里开始滚动日志包括查找元素、点击坐标等操作记录。3.4 快速验证WDA是否被Windows成功驱动连接成功后我想给你两个验证手段避免后面测试用例跑不起来时误以为环境问题。第一个是直接看WDA的状态接口。在Windows的浏览器里访问http://192.168.31.88:8100/status如果返回一段JSON开头带state: success说明WDA的HTTP服务是通的。这个验证不依赖Appium就算测试代码还没写好也能排查到网络层面。第二个是用Appium Inspector。在Windows上打开Appium Inspector配置Remote Host为127.0.0.1、Port为4723把上面的Capabilities填进去点Start Session。如果能看到当前App的截图和层级树就说明Windows到WDA的通路完全打通了。至此你已经可以在Windows上驱动iOS 17/18设备做自动化了。4. 常见问题与排查技巧实录4.1 iOS真机在Windows上识别不到这个问题太常见了而且很多人会先怀疑USB线。注意不是所有Type-C线都能传数据有些只能充电。先换一根原装线试试。第二步是检查Windows设备管理器如果能看到带黄色感叹号的Apple Mobile Device USB Driver说明驱动有问题。解决方法一般是卸载设备后重新插拔或者卸载后重新安装iTunes。如果还是没有打开服务管理器确认Apple Mobile Device Service处于运行状态手动启动后再试一次。还有一种情况是iPhone没弹“信任此电脑”。连接后如果屏幕上弹窗一定要点“信任”否则电脑侧根本拿不到设备信息。在iOS 17/18上弹窗位置有时不在锁屏界面而在通知中心或控制中心附近注意看消息通知。4.2 签名证书相关的报错WDA构建时Xcode最常报的是No signing certificate iOS Development found或者Failed to register bundle identifier。前者是因为Apple ID没有创建过开发证书登录开发者后台确认证书状态后者是因为Bundle ID重复或格式不对。免费账号无法注册被占用的Bundle ID必须换一个足够独特的。另外免费账号签名7天有效。如果你今天配好了WDA下周再跑又报Unable to launch WebDriverAgentRunner大概率是证书过期了。处理方式很简单重新插上Mac在Xcode里再点一次Run让手机上的WDA更新签名。iOS 17/18对过期证书的检测比旧版本更严格所以这个坑在20xx年后的系统上基本躲不开。4.3 Appium连不上WDA、网络状态异常Appium报Could not connect to WebDriverAgent先别急着怀疑Windows代码大概率是网络或WDA进程出了问题。第一步确认iPhone和Windows电脑连的是同一个局域网且能互通。第二步确认WDA还活着手机上的自动化界面有没有被手动切走WDA进程被系统杀掉后状态接口也访问不到。还有Windows防火墙这个隐形杀手。Appium发送的请求是Windows到iPhone的8100端口如果是Wi-Fi局域网Windows防火墙可能会拦截出站请求。在“允许应用通过防火墙”里给Node.js或Appium添加例外或者临时关闭防火墙验证一下。如果确认是防火墙问题再细化为端口规则没必要把整个防火墙关闭。常见错误对照表报错或现象可能原因处理方向设备管理器有黄色感叹号USB驱动问题重装iTunes或更新驱动Xcode签名报No signing certificate没有可用证书添加Apple ID并创建开发证书7天后WDA无法启动免费签名过期重新用Mac签名安装浏览器访问/status超时网络不通或WDA已死检查局域网、重启WDAAppium报Could not connect8160端口不可达检查防火墙、网络启动会话后无法点击元素目标App没安装或Bundle ID错误核对bundleId和udid另一个容易忽略的坑是手机锁屏。iOS 17/18在锁屏一段时间后会断开某些网络服务WDA虽然进程还在但HTTP响应会变慢或者卡住。自动化长时间跑批时我一般会把iPhone的自动锁屏设置为“永不”并在Windows脚本里每隔一段时间发送一个status请求保持活跃。4.4 端口被占用或WDA重复启动WDA默认监听8100端口。如果手机上有多个WDA进程或者旧版本残留新启动的WDA会抢不到端口日志里会出现Address already in use。处理办法是先结束手机上所有WDA进程直接拔下USB会让WDA退出再重新用Mac启动一次。不要尝试在Windows上手动强杀手机进程那个路径复杂且不稳定。Windows端4723端口也可能被占用。启动Appium前先在命令行执行netstat -ano | findstr 4723如果看到端口被占用要么杀掉对应PID要么用appium --port 4724换一个端口。测试脚本里的Remote地址也要同步改。这不算什么高级问题但就是这种小事最容易在关键时刻拖慢节奏。5. 一些让流程更顺的实操心得最后分享几个我实际踩过坑之后沉淀下来的习惯算不上什么高深理论但能让整个流程顺不少。第一个心得是把“Mac构建WDA”这一步脚本化。别每次都手动在Xcode里点Run用命令行导出并安装到真机这样Windows端需要重置WDA时可以远程触发Mac脚本执行省得每次都要跑到Mac前操作。构建命令大致是xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination id你的UDID test这个可以写进Makefile或CI脚本。第二个心得是Windows端尽量固定使用webDriverAgentUrl模式不要走自动构建流程。xcuitest driver在检测到有可用WDA地址时会跳过构建逻辑直接连接速度快很多。自动构建在Windows上本来就走不通万一配置里漏了webDriverAgentUrlAppium会尝试用本机Xcode构建然后直接报环境错误白白浪费时间。第三个心得是给手机端做一个“WDA运行状态检查”的小脚本。因为iOS 17/18下WDA随时可能因为锁屏、内存回收、证书过期而失效用Python写个定时请求/status的脚本一旦连续几次失败就提醒相关人员处理比自己每天肉眼盯着Xcode控制台高效得多。另外真机连接时我优先推荐USB加端口转发的方式而不是走Wi-Fi。Windows下可以用libimobiledevice的iproxy做端口转发把设备的8100端口映射到Windows的8100端口这样webDriverAgentUrl直接填http://127.0.0.1:8100连接更稳定也不受路由器信道干扰。我第一次用Wi-Fi跑iOS 18真机页面加载偶尔卡十几秒换成USB转发之后基本没再出现过这种问题。说到iOS 18最后提醒一下如果你手头是iOS 18的设备先确认Mac上的Xcode版本在16以上旧版Xcode连部署都过不去更别提在Windows端启动了。这个版本匹配关系是很多新项目第一周容易踩的雷提前检查能省不少事。Windows下跑WDA最怕的不是技术难而是方向没搞清。只要记住WDA生成和部署必须在Mac日常驱动可以完全交给Windows这个分工理顺了后面就是按流程堆细节的事。希望这篇经验能让你绕开我踩过的那些坑把iOS 17/18自动化环境搭得更稳。