尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Xcode 15下Appium WDA真机编译全攻略:手把手解决iOS自动化环境搭建难题

Xcode 15下Appium WDA真机编译全攻略:手把手解决iOS自动化环境搭建难题 1. 项目概述为什么iOS自动化测试总是“从入门到放弃”如果你是一名移动端测试工程师或者对自动化测试感兴趣那么“iOS自动化”这个词大概率会让你又爱又恨。爱的是一旦跑通它能极大地解放双手提升回归测试的效率和准确性恨的是在真正跑通之前你可能会遇到一堵由各种环境配置、版本兼容和编译报错组成的“叹息之墙”。尤其是当Xcode更新到15版本Appium的WebDriverAgentWDA这个核心组件在真机上的编译过程足以让一个充满热情的开发者瞬间萌生“放弃”的念头。这并非危言耸听而是无数同行在社区里用血泪踩出的坑。这个项目的核心目标非常明确手把手带你使用最新的Xcode 15在一台真实的iPhone上成功编译并运行Appium的WDA并解决你在这个过程中可能遇到的所有主流编译报错。这不是一个泛泛而谈的教程而是一份基于实战的排坑指南。我们会从最基础的证书配置讲起深入到Xcode 15带来的新变化逐一拆解那些令人头疼的“Code Signing Error”、“Build Failed”和“Provisioning Profile”问题。我的经验是iOS自动化环境搭建的成功90%取决于你对苹果开发者体系证书、描述文件、签名和Xcode工程配置的理解剩下的10%才是Appium脚本的编写。很多人倒在了那90%上所以这篇文章会聚焦于此帮你把那90%的路铺平。2. 环境准备与核心工具解析在开始“手把手”操作之前我们必须把舞台搭好。这里的每一个工具和账号都不是可有可无的它们环环相扣缺一不可。2.1 硬件与软件清单首先你需要准备以下“硬通货”一台macOS电脑这是iOS开发的铁律。虚拟机或黑苹果可能会在签名等环节遇到无法预知的问题强烈不建议。一部用于测试的iPhone系统版本最好在iOS 15及以上与Xcode 15的兼容性更好。请确保能用数据线正常连接电脑。一个有效的Apple ID并且最好注册成为苹果开发者每年688元。虽然使用免费账户也能进行一些有限制的真机调试但为了获得完整的自动化能力特别是WebDriverAgent需要后台运行付费开发者账号几乎是必须的。免费账户会遇到“进程无法在后台启动”等权限问题。软件方面我们需要这三驾马车Xcode 15从Mac App Store下载并安装。安装后第一次启动务必完成命令行工具的安装xcode-select --install。Xcode不仅是开发工具更是管理证书和设备的中心。HomebrewmacOS的包管理器。打开终端使用/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)安装。它是我们安装其他工具的快捷方式。Appium我们选择通过npm安装Appium 2.0。在终端执行npm install -g appium。安装完成后可以通过appium driver install xcuitest来安装iOS自动化所必需的XCUITest驱动。注意很多教程还停留在Appium 1.x时代其架构与2.0有显著不同。2.0采用了插件化驱动管理更清晰。本文基于Appium 2.0。2.2 理解核心WebDriverAgent (WDA) 是什么这是整个iOS自动化的引擎也是最容易出问题的部分。简单来说WDA是一个由Facebook现Meta开源后被Appium项目采纳的iOS应用。它实现了WebDriver协议安装到你的iPhone上之后就相当于在手机里植入了一个“遥控接收器”。你的Appium测试脚本无论用Python、Java还是JavaScript编写通过这个协议向WDA发送指令如点击、滑动、获取元素WDA再在iOS系统内部执行这些操作。因此我们的核心任务就是将这个WDA应用成功编译、签名并安装到你的真机上。问题就出在“编译”和“签名”这两个步骤它们紧密依赖于你的Apple开发者账号状态和Xcode工程配置。3. 手把手实战WDA工程配置与编译好了理论说完我们开始动手。请一步步跟随操作。3.1 获取与打开WDA工程Appium 2.0将WDA的集成方式做了优化但我们为了彻底理解并手动解决签名问题最好直接操作其源码工程。在终端找一个合适的目录克隆WDA的官方仓库git clone https://github.com/appium/WebDriverAgent.git cd WebDriverAgent使用Xcode打开项目open WebDriverAgent.xcodeproj此时Xcode会打开这个项目。在项目导航栏中你会看到两个主要的TargetWebDriverAgentRunner和IntegrationApp。WebDriverAgentRunner是我们需要编译并安装到设备上的核心测试包Test Bundle它将在后台运行。IntegrationApp是一个辅助的UI应用可用于手动验证WDA的基础功能。3.2 配置开发者团队与Bundle Identifier这是最关键的一步大部分编译报错源于此。选择Target在Xcode左上角确保选中了WebDriverAgentRunner。设置Team在右侧的“Signing Capabilities”标签页找到“Team”下拉框。这里应该显示你已付费的开发者账号所属的团队。如果显示“None”或你的个人Apple ID请务必选择正确的开发者团队。免费账户这里可能无法选择团队会导致后续签名失败。修改Bundle Identifier在“Bundle Identifier”一栏你会发现默认是com.facebook.WebDriverAgentRunner。这个ID很可能已经被其他开发者包括苹果的样例占用了。你必须将其修改为一个全球唯一的标识。通常的做法是使用你的开发者账号反向域名格式例如com.yourcompanyname.WebDriverAgentRunner。将yourcompanyname替换为你自己独有的字符串。同样操作对IntegrationAppTarget也执行第2、3步设置相同的Team并修改其Bundle Identifier如com.yourcompanyname.IntegrationApp。实操心得Bundle Identifier的冲突是隐形的杀手。如果你不修改可能会遇到“Failed to register bundle identifier”的错误。一个简单的命名规则是com.[你的名字拼音缩写].wda.runner。3.3 解决Xcode 15的新增编译设置Xcode 15引入了一些新的默认编译设置可能导致WDA这类较老项目编译失败。我们需要手动调整。在项目导航器中选择顶层的WebDriverAgent项目蓝色图标然后选择WebDriverAgentRunnerTarget切换到“Build Settings”标签页。在搜索框中输入“Other Linker Flags”。找到这项配置双击其值进行编辑。确保其中包含-ObjC和-all_load。如果没有请添加。这是链接Objective-C代码所必需的。继续搜索“Enable Bitcode”。将其设置为NO。Bitcode是苹果的中间代码WDA项目通常不兼容关闭它可以避免很多链接错误。搜索“Validate Workspace”。尝试将其设置为YES。这个设置有时能解决一些深层依赖和签名问题。3.4 在真机上编译运行用USB数据线将你的iPhone连接到Mac。在Xcode窗口顶部的Scheme工具栏中确保设备选择了你连接的iPhone而不是Any iOS Device或模拟器。点击Product菜单 -Destination- 选择你的设备。现在尝试点击运行按钮三角形或按Cmd R。我们的目标不是一次成功而是触发并收集错误信息。4. 常见编译报错全解析与解决方案编译过程几乎一定会报错。别慌每一个错误都是通往成功的路标。下面我整理了最常见的几类错误及其根除方案。4.1 证书与签名类错误这类错误出现频率最高信息也最令人困惑。错误示例1Signing for “WebDriverAgentRunner” requires a development team. Select a development team in the Signing Capabilities editor.原因没有为Target选择开发者团队。解决严格按照3.2节操作在“Signing Capabilities”中为WebDriverAgentRunner和IntegrationApp都选择正确的付费开发者团队。错误示例2Failed to register bundle identifier. The app identifier “com.facebook.WebDriverAgentRunner” cannot be registered to your development team because it is not available.原因Bundle Identifier被占用或格式不对。解决修改Bundle Identifier为一个唯一的名称如前文所述。修改后可能需要清除Xcode的缓存Product-Clean Build Folder(ShiftCmdK)。错误示例3No profile for team ‘XXXXXXXX’ matching ‘WebDriverAgentRunner’ found.原因Xcode无法自动创建或找到匹配的描述文件Provisioning Profile。解决确保设备已添加到你的开发者账号中。在Xcode中进入Window-Devices and Simulators在“Devices”标签下确认你的iPhone已出现。尝试让Xcode自动管理签名在“Signing Capabilities”中勾选“Automatically manage signing”。Xcode会尝试自动为你创建证书和描述文件。如果失败它会给出更具体的错误提示。如果自动管理失败需要手动处理登录 Apple Developer网站 在Certificates, Identifiers Profiles中检查是否有有效的iOS Development证书。如果没有创建一个。确保你的设备的UDID已注册到该开发者账号下。为刚才修改的唯一Bundle Identifier创建一个App ID。创建一个Development类型的Provisioning Profile关联上述证书、App ID和设备。在Xcode中取消“Automatically manage signing”手动选择这个描述文件。踩坑实录有时候即使描述文件配置正确Xcode依然报错。一个终极清理方法是关闭Xcode删除~/Library/MobileDevice/Provisioning Profiles/目录下所有文件然后重启Xcode并重新尝试自动管理签名。这能清除旧的、无效的描述文件缓存。4.2 编译与链接类错误这类错误与代码和编译设置相关。错误示例4Undefined symbol: _OBJC_CLASS_$_XXXX原因通常是“Other Linker Flags”设置不正确导致Objective-C的类别Category或静态库没有正确链接。解决确认已按照3.3节设置-ObjC和-all_load。如果问题依旧检查是否引入了其他第三方库但路径不对。错误示例5Building for iOS, but the linked framework ‘*.framework’ was built for iOS iOS Simulator.原因这是Xcode 15引入的“新”问题其实质是使用了包含模拟器架构x86_64, arm64的胖二进制框架而真机编译只需要arm64架构。解决找到报错提示中的那个.framework文件。使用lipo命令剥离不需要的架构。例如假设框架路径是VendorLib/Some.framework/Some# 查看当前包含哪些架构 lipo -info VendorLib/Some.framework/Some # 如果输出包含 i386 x86_64 arm64则需要移除模拟器架构 lipo -remove x86_64 VendorLib/Some.framework/Some -output VendorLib/Some.framework/Some lipo -remove i386 VendorLib/Some.framework/Some -output VendorLib/Some.framework/Some # 再次查看应该只剩 arm64 lipo -info VendorLib/Some.framework/Some或者更简单的方法是尝试在项目的“Build Settings”中为WebDriverAgentRunnerTarget设置ONLY_ACTIVE_ARCH为YES。4.3 设备信任与权限类错误编译成功后安装到设备上运行时也可能出错。错误示例6应用安装成功但启动立即崩溃或在设备上看到“不受信任的开发者”。解决在iPhone上进入设置-通用-VPN与设备管理或设备管理。你应该能看到一个以你开发者账号命名的企业级应用描述文件。点击它然后选择“信任 [你的开发者账号]”。之后再次从Xcode运行应用。错误示例7WDA启动后无法访问内部Web服务默认http://设备IP:8100。原因iOS应用默认不允许非HTTPS请求。WDA内部服务使用的是HTTP。解决这是Appium环境的一部分。当你后续通过Appium启动会话时Appium的XCUITest驱动会处理这个通信。单独手动测试时可以暂时在iPhone的设置-Safari浏览器-高级-Web检查器中打开开关并通过Safari的“开发”菜单连接设备进行调试。但自动化测试时依赖Appium即可。5. 验证与连接让Appium驱动你的iPhone当你在Xcode中成功将WebDriverAgentRunner运行到你的iPhone上并且手机上没有立即崩溃就说明WDA已经成功部署了。接下来我们要让Appium能够指挥它。5.1 启动Appium Server打开一个新的终端窗口输入以下命令启动Appium服务器appium server --allow-insecureadb_shell--allow-insecure参数是为了允许一些必要的非安全连接。看到[Appium] Welcome to Appium v2.x.x和[Appium] Appium REST http interface listener started on 0.0.0.0:4723之类的信息说明服务器启动成功。5.2 准备Python测试脚本示例这里以Python为例你需要安装Appium-Python-Client包pip install Appium-Python-Client。创建一个Python文件例如test_ios.py写入以下内容。请务必根据你的实际情况修改desired_caps中的参数from appium import webdriver from appium.options.ios import XCUITestOptions import time # 配置设备能力 options XCUITestOptions() options.platform_name iOS # 你的设备系统版本如 ‘16.6’ 在 设置-通用-关于本机 中查看 options.platform_version ‘YOUR_IOS_VERSION’ # 你的设备名称在Xcode的 Devices and Simulators 窗口可以看到或使用 ideviceinfo -k DeviceName 命令 options.device_name ‘YOUR_DEVICE_NAME’ # 这里填写你修改后的 WebDriverAgentRunner 的 Bundle Identifier options.bundle_id ‘com.yourcompanyname.WebDriverAgentRunner’ # 必须设置为 true表示不重置App状态对于WDA Runner很重要 options.no_reset True # 确保使用原生的XCUITest驱动 options.automation_name ‘XCUITest’ # 如果WDA没有安装在本地Appium会自动从网络获取但我们已经本地编译了所以指定本地路径会更快更稳定 # options.xcode_org_id ‘你的开发者团队ID’ # 有时需要 # options.xcode_signing_id ‘iPhone Developer’ # 有时需要 # options.updated_wda_bundle_id ‘com.yourcompanyname.WebDriverAgentRunner’ # 指定我们修改后的Bundle ID # 连接Appium服务器 driver webdriver.Remote(‘http://localhost:4723’, optionsoptions) try: # 一个简单的验证获取当前页面上下文对于WDA通常是NATIVE_APP contexts driver.contexts print(f”Available contexts: {contexts}”) # 可以尝试获取屏幕尺寸 size driver.get_window_size() print(f”Screen size: {size}”) time.sleep(2) except Exception as e: print(f”An error occurred: {e}”) finally: # 关闭会话 driver.quit()5.3 执行测试与问题排查确保iPhone与Mac在同一Wi-Fi网络下并且Mac的防火墙没有阻止4723端口。在终端运行你的Python脚本python test_ios.py。可能遇到的问题及排查An unknown server-side error occurred: ‘A new session could not be created.‘排查这是最笼统的错误。首先查看Appium服务器的日志里面会有更详细的错误信息。常见原因1deviceName或platformVersion写错。必须与设备完全匹配。常见原因2WDA在设备上启动失败。回到iPhone上看看WebDriverAgentRunner应用是否在运行可能没有图标但可以在“后台应用刷新”或最近任务里看到。尝试从Xcode再次运行它。常见原因3证书/签名问题依然存在。检查设备上的“信任”设置。Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65原因Xcode编译WDA失败。这就是我们前面花了大量篇幅解决的问题。你需要仔细阅读Xcodebuild的完整错误日志通常在Appium日志中会有一大段并根据第4节的内容对症下药。code 65通常就是签名错误。成功迹象如果脚本运行后没有抛出异常并打印出了屏幕尺寸等信息同时在Appium服务器日志中看到[WD Proxy] Proxying [GET /status] to [GET http://127.0.0.1:8100/status] with no body并返回成功响应那么恭喜你你的iOS自动化环境已经彻底打通了6. 进阶配置与维护心得环境搭建只是一次性的战斗维护和高效使用才是长期的战役。6.1 使用appium-xcuitest-driver的wdaLocalPort为了避免端口冲突你可以在Capabilities中指定一个本地端口来转发WDA服务options.wda_local_port 8100 # 可以指定为其他空闲端口这样Appium会通过这个端口与设备上的WDA通信。6.2 关于WDA的更新WDA项目仍在活跃更新。当你更新Xcode或iOS大版本后可能会需要更新WDA。建议备份你已修改好签名的WebDriverAgent.xcodeproj目录。重新拉取最新的WDA代码。将备份目录中关于Bundle Identifier和Team的配置主要是.xcodeproj包内的project.pbxproj文件相关部分或直接覆盖整个修改过的文件谨慎地合并到新代码中。这是一个需要细心的工作。6.3 真机与模拟器的切换本文聚焦真机。如果你也需要在模拟器上运行流程会简单很多因为不需要处理证书签名。只需在Xcode和Appium的Capabilities中将设备名称deviceName改为模拟器名称如iPhone 15并将platformVersion改为对应的模拟器系统版本即可。模拟器的UDID可以在xcrun simctl list devices命令输出中找到。整个过程最磨人的部分就是与苹果的代码签名体系打交道。每一次报错都是对你耐心和排查能力的一次考验。我的个人体会是保持冷静逐字阅读错误信息善用搜索引擎但要注意信息的时效性优先看一年内的帖子并且做好每一步的笔记。一旦你成功打通过一次理解了证书、描述文件、Bundle ID、Team之间的关系以后再遇到类似问题你就能快速定位不会再感到畏惧。自动化测试的价值在于长期的回报而攻克环境搭建这道难关就是获得这份回报必须支付的第一笔也是最值得的学费。
返回列表