如何在UI自动化测试中为iOS扩展添加启动参数与环境变量
问题描述
现有一套UIAutomation测试脚本,用于测试搭载Share Extension(分享扩展)的应用,需要在测试时向该分享扩展传入launchArguments与launchEnvironment属性,但始终未找到可行的实现方案。
调试扩展内的ProcessInfo时,设置的自定义参数值并未生效,此前先后尝试过两种参数设置方式:
第一种设置方式:
XCUIApplication(bundleIdentifier:"com.my.app").launchArguments = ["TEST"] XCUIApplication(bundleIdentifier:"com.my.app").launchEnvironment = ["TEST":"TEST"]
第二种设置方式:
XCUIApplication().launchArguments = ["TEST"] XCUIApplication().launchEnvironment = ["TEST":"TEST"]
补充说明:通过bundle identifier查找进程时,可准确定位到目标扩展进程,需要找到正确的配置方法让传入扩展的启动参数与环境变量生效。
解决方案
两种设置方式不生效的核心原因是:Share Extension是独立于主应用运行的单独进程,上述两种写法的操作对象都是主应用进程,配置自然不会同步到扩展进程上。
正确配置步骤如下:
- 初始化
XCUIApplication实例时,传入的bundle identifier必须填写分享扩展自身的bundle ID,而非主应用的bundle ID。例如分享扩展的bundle ID为com.my.app.shareext,就使用该值初始化实例。 - 不要手动调用扩展对应
XCUIApplication实例的launch()方法。分享扩展由系统在触发分享动作时自动启动,只需要在扩展被唤起前,提前给对应实例设置好launchArguments和launchEnvironment即可,系统启动扩展时会自动注入预设的参数。
正确代码示例:
// 初始化时绑定分享扩展的bundle ID,不要填主App的 let shareExtension = XCUIApplication(bundleIdentifier: "com.my.app.shareext") // 提前配置启动参数和环境变量 shareExtension.launchArguments = ["TEST"] shareExtension.launchEnvironment = ["TEST": "TEST"] // 后续正常执行测试流程:触发主App的分享动作、选择对应分享扩展即可 // 扩展启动后,就可以通过ProcessInfo.processInfo.arguments、ProcessInfo.processInfo.environment读取到设置的参数
配置注意事项:
- 参数配置必须在分享扩展被系统唤起之前完成,如果扩展已经处于运行状态,配置不会生效,需要先终止扩展进程再重新触发分享动作唤起扩展。
- 主应用和分享扩展的参数配置完全独立,如果测试流程中需要同时操作两个进程,分别初始化对应bundle ID的
XCUIApplication实例单独配置即可。 - 无参构造的
XCUIApplication()实例默认绑定当前测试Target关联的主应用进程,无法用来给扩展进程配置参数。
内容的提问来源于stack exchange,提问作者Mark Bridges
相关产品推荐
相关产品推荐

