免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

从零配置WebDriverAgent:iOS真机自动化测试环境搭建指南

从零配置WebDriverAgent:iOS真机自动化测试环境搭建指南 搞iOS自动化绕不开WebDriverAgent这个坎。不管你是用Appium做功能测试还是想通过脚本批量跑性能采集WDA一直是真机自动化里最基础的那一层。我在Mac上从零配过好几套环境踩过签名、端口映射、手机端权限各种坑今天把这套完整流程整理出来给准备入手的你一份能直接照着做的参考。先说清楚WebDriverAgent到底是个什么角色。它本质上是Facebook开源、后来由Appium社区接手维护的一个基于XCUITest的测试驱动服务。你把WDA编译后装到iPhone上手机就变成了一个能被外部程序通过WebDriver协议控制的节点。Appium Desktop、Appium命令行、甚至你用curl直接请求端口都能驱动这台手机完成点击、滑动、输入等动作。所以无论你后续用什么框架把WDA跑起来都是绕不开的第一步。这篇文章适合刚接触iOS自动化、准备在Mac上搭环境的新手也适合那些被签名、启动问题卡住的老手对照排查。1. 环境准备与前置梳理1.1 Mac硬件与系统版本怎么确认建议使用Intel或Apple Silicon芯片的Mac都可以但要注意Apple Silicon下部分依赖库需要以Rosetta方式运行如果你用的是M系列芯片建议先确认Homebrew安装在哪个架构路径下。这不是玄学而是后面安装carthage、libimobiledevice这类工具时如果架构不匹配很可能会冒出一堆莫名其妙的链接错误。系统版本方面macOS 12及以上跑最新的Xcode 14、15都没问题。如果你的Mac系统太老建议先升级否则Xcode版本一受限iOS SDK版本也随之受限可能导致WDA编译时出现不兼容。个人建议直接用macOS 14或15配合Xcode 15.x以上这个组合踩坑最少。还要检查一下磁盘空间。Xcode自身动辄几十G加上模拟器、缓存至少留出80G以上的空闲空间。我之前吃过亏Xcode下到一半磁盘满了整个开发环境卡在中间最后只能清缓存重新来耽误一下午。1.2 前置工具清单与安装方案需要准备的工具不多但每一件都有其必要性Xcode必装WDA的编译和签名都依赖这个。HomebrewmacOS上的包管理器后面安装各种依赖都靠它。Carthage用于拉取并构建WDA依赖的第三方库。libimobiledevice提供与iOS设备通信的命令行工具主要是用来做端口转发。Appium可选如果你不想只靠curl验证Appium Desktop或Appium命令行可以帮你看得更直观。Xcode直接从App Store下载就行下载后记得先启动一次让Xcode完成开发者工具和模拟器平台的初始化。这一步很多人会忽略但如果你跳过后面用xcodebuild命令时常常会遇到找不到SDK或者无法初始化调试会话的报错。Homebrew的安装如果没装过终端里执行官方脚本。国内网络环境下官方脚本可能比较慢建议配置镜像加速具体操作网上很多这里不赘述。装完以后先执行brew doctor看看环境是否健康再执行brew update确保仓库索引是最新的。Carthage的安装建议直接用Homebrew装二进制版本brew install carthage用源码编译也行但耗时较长而且容易遇到Swift版本兼容问题没必要。libimobiledevice同样一行命令搞定brew install libimobiledevice这里多提一句libimobiledevice会带上usbmuxd工具后面我们用iproxy做端口映射就是靠它。如果你执行后面步骤时发现找不到iproxy命令多半是libimobiledevice安装不完整重装一次即可。1.3 手机端准备与开发者模式手机端的准备比很多人想象的重要。真机至少要运行iOS 14以上系统同时一定要提前开启“开发者模式”。从iOS 16开始苹果把开发者模式藏到了“设置-隐私与安全性”里需要在连接电脑后才会出现在页面上。如果你在设置里翻了一圈没找到可以先插线连接Mac并信任这台电脑然后再去刷新设置页。信任电脑这个动作需要注意手机弹窗出现时如果你点了“不信任”后续WDA安装到一半就会因为无法访问开发者证书而失败。取消信任的方式是进入“设置-通用-还原-还原位置与隐私”然后重新插线信任但这样做会清理掉手机上的所有定位和隐私授权代价不小。所以第一次弹窗一定要看清楚再点。手机端还要保持解锁状态以及关闭“自动锁定”。面朝屏幕、插上数据线、保持亮屏这个状态能避免后面跑WDA用例时手机突然锁屏导致会话断开。用Xcode调试时锁屏会导致连接失败排查起来又得绕一大圈。2. 获取WebDriverAgent源码与依赖构建细节2.1 源码获取渠道怎么选WebDriverAgent的源码主流有两个来源。一个是Facebook官方仓库另一个是Appium团队维护的Appium WebDriverAgent分支。这里我强烈建议使用Appium团队的仓库原因有两点第一Appium分支更新频率高和Appium库的版本兼容性有保障第二Facebook原版已经很长时间不更新对新iOS版本的支持很有限。git clone https://github.com/appium/WebDriverAgent.git cd WebDriverAgent克隆完成后先别急着编译。看一眼目录结构里面有一个WebDriverAgent.xcodeproj工程文件后面所有Xcode相关的操作都基于它。整个仓库还包含Inspector用于页面元素查找、WebDriverAgentRunner核心测试Runner等几个模块首次接触的人容易看花眼先不用管那么多核心只需要关注Runner编译成功即可。2.2 Carthage依赖拉取与常见失败场景WDA依赖了RoutingHTTPServer、CocoaAsyncSocket等几个第三方库这些库通过Carthage管理。在源码目录下执行carthage update --platform iOS这个命令会读取Cartfile拉取依赖并编译成framework。正常情况下等几分钟就完成。但如果你不幸遇到网络问题最常见的情况是访问GitHub Releases超时因为Carthage默认从GitHub下载编译好的二进制包。我第一次跑这个命令就卡在下载某个framework上重试了好几次都失败。后来是在Cartfile里把依赖改成了直接指向源码仓库、不用预编译包的方式才把问题绕过去。不过这种方式要求本机完整的编译链路如果你不想折腾建议配置好GitHub的代理网络多试几次。依赖构建完成后在Carthage/Build/iOS目录下能看到编译好的framework。如果这一层没通过后面Xcode编译就会直接报“找不到模块”的错误。所以每次重新拉代码后都建议先跑一遍carthage确认依赖完整。2.3 直接使用prebuilt Runner的替代方案其实除了完整编译还有一个少有人提到的简便方案直接用Appium团队预编译好的WebDriverAgentRunner。你只需要拿到对应的WebDriverAgentRunner.ipa或者用webdriveragent的npm包自动构建。这种方式省去了本地Xcode编译环节但需要Xcode证书签名。这种方法适合什么样的人呢如果你只是临时跑几个自动化用例不需要修改WDA源码那么prebuilt包能帮你节省至少半小时的编译时间。缺点是无法定制而且第三方的预编译包有时候跟特定iOS版本有兼容性问题。大多数我接触过的团队还是选择从源码编译灵活性高、排查问题时也能改代码加日志。3. 从Xcode签名到命令行启动的完整配置流程3.1 在Xcode中配置开发证书与开发者账号用Xcode打开WebDriverAgent.xcodeproj选择WebDriverAgentRunner这个target。在“Signing Capabilities”页签下勾选“Automatically manage signing”然后选择你的开发者团队。这里要区分一下免费Apple ID和付费开发者账号。免费Apple ID也能跑WDA但有效期为7天到期后需要重新签名安装付费账号证书有效期一年而且支持设置WDA的Bundle ID为专属ID。如果你只是学习或短期内跑测试免费ID完全可以撑过学习期。选择好Team之后Xcode会自动生成一个Provisioning Profile。如果这里报“No profiles for ... were found”大概率是你的证书链不全或者设备没加到账号的Device列表里。解决方法是打开Xcode的“Window-Devices and Simulators”确认左侧能看到你的iPhone并且右侧显示“Registered Device”。看不到手机就插线重新识别还是不行就检查数据线是否支持数据传输。签名搞定以后改一下Bundle Identifier。把项目里的Bundle ID改成你自定义的唯一值例如com.yourname.WebDriverAgentRunner。如果保持默认的com.facebook.WebDriverAgentRunner多台设备或多人协作时容易冲突真机上装过一次再装就会出现“无法安装”的错误。3.2 真机手工编译与端口映射Open Xcode后把Scheme切换到WebDriverAgentRunner真机连接Mac选择手机作为运行设备然后直接点击Run按钮。这一步的目的不是真的要把测试跑起来而是通过Xcode把编译好的Runner安装到手机上。跑完一次后手机上会出现一个名为“WebDriverAgentRunner”的应用。确认应用装好以后后续的操作就可以脱离Xcode了。先把Xcode停下来然后在终端启动端口映射服务iproxy 8100 8100这个命令的含义是把Mac本地的8100端口映射到手机的8100端口。WDA在手机端监听8100端口接收WebDriver协议的请求映射后你在Mac上访问http://localhost:8100就等于访问手机的8100端口。终端会保持前台运行不要关闭这个窗口否则转发也就断了。如果你的手机连接不够稳定可以试试iproxy 8100 8100 -u UDID指定设备。多台真机同时插在Mac上时一定要指定UDID否则iproxy会傻眼提示无法确定设备。3.3 用xcodebuild命令启动WebDriverAgent手工点击Xcode Run只是为了验证能装能跑真正反复使用时不推荐这样干。每次跑都开Xcode不仅占内存而且自动化起来没法控制进程。正确的做法是用xcodebuild命令带参数启动。先确认一下工程支持的目标设备执行xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -showdestinations如果没有配置过Scheme这里可能看不到任何可用的destination。这时需要检查Xcode工程里的Scheme是否shared。打开Xcode的“Manage Schemes”勾选WebDriverAgentRunner对应的“Shared”选项然后重新执行上面命令。很多教程都忽略这个细节导致新手在命令行阶段反复卡住。能查到设备后执行启动命令xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination id你的设备UDID test加-destination platformiOS,idxxx也可以指定UDID的方式最稳。命令跑起来后会有一大串日志输出看到“Test Case ... started.”说明WDA已经在手机端跑起来了。这时候打开另一个终端窗口验证curl http://localhost:8100/status如果返回一串包含ready: true的JSON恭喜WDA已经正常运行。你可以继续用Appium连接这个地址也可以在浏览器里访问http://localhost:8100/inspector进行页面查找。3.4 配置好环境变量与Appium连接实际工作中我习惯把WDA的启动脚本整理成一个Shell函数存放在~/.zshrc里方便随时一键启动start_wda() { xcodebuild -project ~/WebDriverAgent/WebDriverAgent.xcodeproj \ -scheme WebDriverAgentRunner \ -destination id$1 \ test }使用时直接start_wda UDID。而Appium侧只需要在Capabilities里指定{ platformName: iOS, platformVersion: 17.4, deviceName: iPhone, udid: 00008110-xxxxxxxx, automationName: XCUITest, webDriverAgentUrl: http://localhost:8100 }请注意如果你在Appium里面显式指定了webDriverAgentUrlAppium会直接复用你手动启动的WDA而不是自己再去构建一份。省去了Appium每次自动构建WDA的等待时间也让排查问题更简单。如果不指定Appium会自动找设备并构建启动WDA这个过程中的日志错误往往不直观新手容易绕晕。3.5 免开发者账号签名与自动续期思路免费Apple ID签名每次只有7天有效期这对长期跑自动化的人来说很烦。解决的思路有两个方向。第一个思路申请一个专用的开发者证书然后把证书和描述文件配置好在xcodebuild命令里指定-allowProvisioningUpdates这样到期后重新跑一次命令即可。第二个思路结合GitLab CI自动构建签名定时任务每隔几天重新签名并安装WDA到设备上实现自动化续期。第二个思路稍微复杂但这确实是大批量测试设备管理时很实用的做法。通过脚本定时执行签名、构建、安装流程能从机制上解放手工操作。具体用到的命令包括xcrun altool或者devicectl device install app它们属于Xcode附带的工具链安装路径在Xcode内部直接执行系统命令即可。4. 常见问题与排查技巧实录4.1 编译期报错的应对办法编译是最容易卡壳的环节常见问题我列过一张表贴出来供你对照报错信息常见原因解决方案module not foundCarthage依赖未构建检查Carthage/Build/iOS目录是否有frameworkcode signing is required未配置开发者账号检查Signing Capabilities里的TeamSigning certificate is invalid证书到期或被吊销重新生成开发者证书并下载安装Could not find destinationXcode不可用或设备未识别检查数据线、信任状态、Xcode版本No profiles found设备未注册在Xcode Devices窗口添加设备并刷新Profile针对module not found这种情况我补充一下实操思路删除整个Carthage目录重新跑carthage update --platform iOS注意这个过程需要保持网络稳定。还有一次我遇到的是Xcode路径没配好导致Carthage找不到SDK执行sudo xcode-select -s /Applications/Xcode.app/Contents/Developer把Xcode路径切到当前版本就能解决。这一步是非常基础但非常好用的排查手段推荐优先尝试。4.2 启动时常见运行时问题WDA能编译出来但启动不了这类问题在真机上很常见。有一种典型情况是手机端启动Runner后界面还没起来就自动退出。去设置-隐私与安全性-开发者模式里检查是否已经开启开发者模式同时确认“开发者应用”里有没有批准你的开发者证书。另外一类问题集中在端口转发上。启动报“Failed to bind”说明8100端口被占用了用lsof -i :8100查一下是哪个进程占用的端口杀掉旧进程后重新iproxy就行。也可能出现iproxy连接上了但curl请求一直超时这时要检查WDA是否还活着看xcodebuild窗口的日志到底停在哪个步骤。如果日志停在“Waiting for test session to start”多半是手机屏幕锁屏或者Wi-Fi与电脑不在同一网络导致的传输问题。真机上如果反复出现Failed to create session通常是WDA运行时的session冲突先把手机后台所有WebDriverAgentRunner进程杀掉再重新启动。有时候连续跑用例后挂掉的WDA进程不会自动释放不杀掉新会话永远建立不起来。4.3 版本兼容性方面的心得iOS系统升级会导致旧的WDA构建产物不可用这是最烦的事情。以iOS 17为例早期WDA版本用旧的WebDriver协议处理方式就会出现自动化点击坐标偏移、转动屏幕后方向不对等问题。建议你关注Appium团队的Release Notes每到新版系统发布后及时更新WDA源码并重新编译。还有一种比较隐蔽的问题如果你同时装了多个Xcode版本xcodebuild默认用的可能是旧版Xcode里的工具链编译出来的WDA在新iOS系统上可能表现为能安装但无法自动化操作。排查方式是在终端执行xcode-select -p确认指向的是你正在使用的那一个Xcode路径。4.4 排查流程化的建议我结合自己几次排错的经验总结一个从底向上的排查顺序新手照着走会轻松很多先看手机端有没有正常安装Runner应用没装上就查签名和设备注册。再看WDA是否真的启动去xcodebuild日志找“started”关键词。然后确认端口转发是否正常Mac上curl本地端口有响应才行。最后才是Appium层面的Capabilities对不对是否指向了正确的地址。按照这个顺序排查能避免很多无效尝试。我之前看到不少朋友一遇到问题就改Appium配置折腾半天发现手机端WDA压根没跑起来方向错了所有调整都白费。4.5 关于Inspector与页面元素定位WDA跑起来后你可以通过内置Inspector查看当前手机页面上的元素树。在浏览器访问http://localhost:8100/inspector能直接看到当前界面的层级和每个控件的accessibility属性。对iOS开发者来说这里有个原生概念需要注意XCUITest的主要定位依据是accessibilityIdentifier和accessibilityLabel如果你的App代码里没有给控件设置这两个属性那Inspector里看到的往往只剩坐标位置定位起来非常吃力。建议开发同学在写代码时就把控件的accessibilityIdentifier明确设置好这不仅能节省自动化用例的编写时间还能让整个测试体系更稳定。有一点很反直觉WDA并不是只靠屏幕坐标来定位元素它底层走的是可访问性树因此可以做到跨分辨率、跨设备型号的定位一致性。充分利用这一特性你的自动化脚本就不会因为换了一台手机就全部失配。5. 自动化链路中的一些延伸思考WebDriverAgent配置好只是第一步真正决定自动化稳定性的是你如何使用它。在持续集成场景下我比较推荐把WDA构建和启动整合进你的CI流水线。比如在GitLab CI/CD中利用一台装了Xcode的Mac Runner每次代码更新后自动编译WDA并安装到设备池然后针对多台不同型号的iPhone并行跑测试用例。这样做的好处是一旦系统更新导致WDA失效CI第一时间就会报错倒逼测试基建保持健康。如果你没有CI环境至少也应该把上面整理的Shell脚本固化下来不要每次临时开Xcode手动操作。手动点击次数越多越容易漏掉签名或端口映射的某一步自动化出问题你也很难判断到底是脚本问题还是环境漂移问题。另外WDA的日志信息非常详实遇到疑难杂症时建议开启-verbose模式分析。命令末尾加-verbose后终端输出的日志会携带所有HTTP请求路由的细节。我调试过一次某个控件点击后没反应查系统API返回发现是该控件的显隐状态在点击瞬间被切换了这类问题光看宏观日志根本定位不了。日志这块再补充一句WDA运行期间还会在手机端控制台输出系统日志通过idevicesyslog可以拉取真机日志。如果你需要排查一些比较底层的触摸事件有没有送达这些日志比Mac端日志更接近真相。关于多设备自动化如果你手头设备很多建议为每台设备建立一个独立的Profile目录记录IP、UDID、系统版本和Appium连接配置。脚本化后一切都可以变成一行命令从设备池里挑一台目标机器启动测试。设备池越规范自动化跑得越顺畅这也是很多大厂测试方案的核心思路。WebDriverAgent的整体配置流程比我讲得要曲折但核心也就几步环境准备、源码构建、签名安装、端口映射、启动验证。工具链版本越新越可能遇到未知问题不要怕按照底层原理一步步排查绝大多数问题都能找到原因。配置的过程中最忌讳的就是跳步和“差不多就行”签名差一点、目录选错一个、端口忘了映射都会导致你后面前功尽弃。我个人的体会是做iOS自动化环境这件事耐心比技术本身更重要。只要每一步都弄明白为什么后面整个链路都会顺很多。最后再分享一个小技巧把WDA工程的Xcode工程文件做个备份到网盘或Git仓库当本机Xcode升级导致环境出问题时可以直接借别人的编译产物先顶一阵子不耽误测试进度。自动化环境这种事备好退路永远不亏。
返回列表