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”

在 iOS 7 中禁用 Core Data 中的 iCloud(也就是将持久存储文件迁移到本地)

iCloud 邮件附件大小限制