iCloud UI 测试显示警报登录到 iCloud,尽管已登录并为应用程序启用了 iCloud
Posted
技术标签:
【中文标题】iCloud UI 测试显示警报登录到 iCloud,尽管已登录并为应用程序启用了 iCloud【英文标题】:iCloud UI Testing displays alert Sign In to iCloud, although logged in and iCloud is enabled for the app 【发布时间】:2018-03-04 16:34:01 【问题描述】:我的应用使用 iCloud,我想使用模拟器对其进行 UI 测试。 因此,我使用系统设置将模拟器登录到 iCloud。 现在我可以毫无问题地运行我的应用程序。
当我尝试 UI 测试在系统设置应用程序中禁用 iCloud 使用时会发生什么时,就会出现问题。
为此,我首先使用
启动我的应用程序app = XCUIApplication()
app.launch()
然后,我想在设置应用中禁用 iCloud。因此,我使用
打开这个应用程序let settingsApp = XCUIApplication(bundleIdentifier: "com.apple.Preferences")
settingsApp.launch()
这确实会打开设置应用程序,但由于某种原因,它会显示警报
我不知道为什么会显示此警报,因为它仅在 UI 测试期间发生,而不是在我运行应用程序、点击主页按钮并启动然后设置应用程序时发生。
此外,我无法使用
捕获此警报let signInAlert = app.alerts["Sign In to iCloud"]
let signInAlertShown = signInAlert.waitForExistence(timeout: 10)
signInAlertShown
设置为 false
如果我在 UI 测试中的此语句之后设置断点。
所以我的问题是: 1) 为什么会显示此警报? 2) 我该如何处理?
【问题讨论】:
【参考方案1】:我仍然不知道为什么会显示此警报,但我现在知道如何处理它:
此警报是异步显示的系统警报。因此,不可能使用
访问它app.alerts["Sign In to iCloud"].waitForExistence(timeout: 10)
相反,应用 UI 被中断。因此,警报必须被警报监视器捕获,并且测试必须等待它:
var alertMonitor: NSObjectProtocol!
var expectation: XCTestExpectation?
…
alertMonitor = addUIInterruptionMonitor(withDescription: "Alerts") (alert) -> Bool in
alert.collectionViews.secureTextFields["Password"].typeText("iCloud Password")
expectation?.fulfill()
alert.buttons["OK"].tap()
…
expectation = expectation(description: "signInToICloudAlert shown")
wait(for: [expectation], timeout: 10.0)
当然,这不是唯一可能发生的异步警报。因此,必须检查是否显示了预期的警报。为清楚起见,已将其省略。
【讨论】:
以上是关于iCloud UI 测试显示警报登录到 iCloud,尽管已登录并为应用程序启用了 iCloud的主要内容,如果未能解决你的问题,请参考以下文章
如何从 UI Test 访问 Apple Id“登录”对话框?
显示没有按钮的 UIAlertController 时 UI 测试失败
在 UI 自动化测试中解除警报时未调用 UIAlertView 的委托方法“clickedButtonAtIndex”