UITest中如何定位并点击iTunes登录弹窗的密码输入框完成填写
解决方案
1. 切换到正确的系统进程查询元素
你之前找不到元素的核心原因是iTunes登录弹窗不属于你的应用,也不属于Springboard(桌面进程),而是由独立的StoreKitUI系统进程控制,你需要先初始化对应进程的XCUIApplication实例再查询元素:
// 初始化StoreKitUI进程实例,旧系统版本可尝试替换为com.apple.itunesstored XCUIApplication *storeKitUI = [[XCUIApplication alloc] initWithBundleIdentifier:@"com.apple.StoreKitUIService"]; // 等待弹窗加载完成,最多等10秒 NSPredicate *existPredicate = [NSPredicate predicateWithFormat:@"exists == YES"]; [self expectationForPredicate:existPredicate evaluatedWithObject:storeKitUI.alerts.firstMatch handler:nil]; [self waitForExpectationsWithTimeout:10 error:nil];
弹窗加载完成后可以打印完整元素树,确认密码输入框的真实属性:
NSLog(@"弹窗元素树:%@", storeKitUI.debugDescription);
通常密码框是secureTextField类型,拿到正确的identifier后直接点击即可:
// 替换成你打印出来的真实密码框identifier XCUIElement *pwdField = storeKitUI.secureTextFields[@"密码"]; if (pwdField.exists) { [pwdField tap]; [pwdField typeText:@"你的沙箱账号密码"]; }
2. 更低成本的键盘焦点切换方案
如果不想处理进程切换和元素查询,可以直接利用键盘的切换逻辑,输入完用户名后跳转到密码框:
XCUIApplication *app = [[XCUIApplication alloc] init]; // 输入Apple ID [app typeText:@"你的沙箱测试Apple ID"]; // 方案1:点击键盘的「下一项」按钮,适配中英文系统 XCUIElement *nextBtn = app.keyboards.buttons[@"下一项"]; if (!nextBtn.exists) { nextBtn = app.keyboards.buttons[@"Next"]; } if (nextBtn.exists) { [nextBtn tap]; } // 方案2:直接按Tab键切换焦点,适配所有键盘布局 // [app typeText:@"\t"]; // 此时焦点已经在密码框,直接输入密码即可 [app typeText:@"你的沙箱测试密码"];
3. AWS Device Farm适配提示
- 提前给测试设备配置好沙箱测试Apple ID,不要使用普通正式账号,避免触发二次验证逻辑导致测试中断
- 如果不需要测试登录流程本身,可以提前在设备的「设置-App Store」登录沙箱账号,跳过弹窗步骤
内容的提问来源于stack exchange,提问作者Nir.Hayun
相关产品推荐
相关产品推荐

