寻求XCTest/XCUITest中FaceID自动化的Swift官方/更新方案
XCTest/XCUITest 实现FaceID录入与匹配自动化(Swift)
前提说明
XCUITest本身不直接提供FaceID录入的官方API,但可以通过模拟系统设置的交互流程完成录入;人脸匹配验证则可通过处理系统权限弹窗、模拟验证结果实现。以下是基于Swift的具体实现方案,适配模拟器与真机环境。
1. FaceID录入自动化
FaceID录入属于系统设置流程,需通过XCUITest导航至「设置」应用完成操作:
import XCTest class FaceIDSetupTests: XCTestCase { let settingsApp = XCUIApplication(bundleIdentifier: "com.apple.Preferences") let testApp = XCUIApplication(bundleIdentifier: "your.app.bundle.id") // 替换为你的应用Bundle ID override func setUpWithError() throws { continueAfterFailure = false settingsApp.launch() } func testFaceIDEnrollment() throws { // 导航至FaceID与密码设置 settingsApp.tables.cells["Face ID 与密码"].tap() // 输入设备密码(替换为你的测试设备密码) let passwordTextField = settingsApp.secureTextFields.firstMatch passwordTextField.typeText("123456") settingsApp.buttons["完成"].tap() // 开始录入FaceID if settingsApp.buttons["设置 Face ID"].exists { settingsApp.buttons["设置 Face ID"].tap() } // 模拟人脸扫描流程(模拟器用⌘+⇧+R触发扫描,真机需手动配合) XCTContext.runActivity(named: "完成人脸扫描") { _ in let firstScanPrompt = settingsApp.staticTexts["将面部置于取景框内"] XCTAssertTrue(firstScanPrompt.waitForExistence(timeout: 10)) // 模拟器触发首次扫描 XCUIDevice.shared.press(.home) let secondScanPrompt = settingsApp.staticTexts["缓慢转动头部"] XCTAssertTrue(secondScanPrompt.waitForExistence(timeout: 10)) // 完成二次扫描 XCUIDevice.shared.press(.home) settingsApp.buttons["完成"].tap() } } }
注意事项
- 模拟器需提前在「设置 > FaceID与密码」中开启FaceID选项;
- 真机测试时,需确保设备已解锁且允许自动化操作。
2. 应用登录流程自动化
启动目标应用,触发登录入口,并处理FaceID权限请求:
func testAppLoginWithFaceID() throws { testApp.launch() // 触发登录按钮 testApp.buttons["登录"].tap() // 处理首次FaceID权限请求弹窗 let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") if springboard.alerts["“你的应用名称”想要使用Face ID"].exists { springboard.buttons["允许"].tap() } // 等待FaceID验证界面加载 let faceIDPrompt = testApp.staticTexts["使用Face ID登录"] XCTAssertTrue(faceIDPrompt.waitForExistence(timeout: 5)) }
3. FaceID人脸匹配自动化
模拟FaceID验证的成功/失败场景,通过系统弹窗交互实现:
func testFaceIDAuthenticationSuccess() throws { testApp.launch() testApp.buttons["登录"].tap() // 等待系统FaceID验证弹窗 let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") let faceIDAlert = springboard.alerts.firstMatch XCTAssertTrue(faceIDAlert.waitForExistence(timeout: 5)) // 模拟验证成功(模拟器点击「通过」,真机需配合硬件) if faceIDAlert.buttons["通过"].exists { faceIDAlert.buttons["通过"].tap() } // 验证登录成功状态 let welcomeLabel = testApp.staticTexts["欢迎回来"] XCTAssertTrue(welcomeLabel.waitForExistence(timeout: 5)) } func testFaceIDAuthenticationFailure() throws { testApp.launch() testApp.buttons["登录"].tap() let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") let faceIDAlert = springboard.alerts.firstMatch XCTAssertTrue(faceIDAlert.waitForExistence(timeout: 5)) // 模拟验证失败 if faceIDAlert.buttons["不通过"].exists { faceIDAlert.buttons["不通过"].tap() } // 验证失败提示 let errorLabel = testApp.staticTexts["FaceID验证失败,请重试"] XCTAssertTrue(errorLabel.waitForExistence(timeout: 5)) }
关键提示
- 模拟器中FaceID验证弹窗按钮为「通过」/「不通过」,真机按钮文本可能不同,需根据实际调整;
- 批量测试可在
setUp方法中提前配置应用权限,避免重复处理弹窗。
内容的提问来源于stack exchange,提问作者Maximiliano alves
相关产品推荐
相关产品推荐

