在 iOS 13 UI 测试中访问 UIActivityViewController 上的按钮会导致崩溃

Posted

技术标签:

【中文标题】在 iOS 13 UI 测试中访问 UIActivityViewController 上的按钮会导致崩溃【英文标题】:Accessing buttons on a UIActivityViewController in an iOS 13 UI test causes a crash 【发布时间】:2019-10-01 00:28:11 【问题描述】:

是否有其他人在使用 Xcode 11 运行 Xcode UI 测试时遇到问题,该测试针对 ios 13 模拟器或在 UIActivityViewController 上查找按钮会导致崩溃的设备?

我有多个 UI 测试来验证 UIActivityViewController 中出现的按钮。他们完成了预期的设置工作,然后寻找类似以下内容的按钮:

XCTAssertTrue(app.buttons["Copy"].exists)

测试在 iOS 10、11 和 12 上运行良好。如果我尝试在 iOS 13 模拟器或设备上运行相同的测试,代码尝试访问 app.buttons 的那一刻,执行停止,我会得到Thread 1: signal SIGABRT 后跟 Failed to get matching snapshots: Lost connection to the application (pid 33047). 在我尝试访问 app.buttons 的那一行。

添加等待甚至是老式的睡眠都无济于事。我试图挖掘XCUIElementTypeQueryProvider 的其他一些查询,以找到没有运气的元素。

如果我在测试访问 app.buttons 之前调试测试并设置断点,并尝试打印其中包含的内容,我会收到不同的错误消息。

po app.buttons
    t =    49.37s Requesting snapshot of accessibility hierarchy for app with pid 37576
expression produced error: error: /var/folders/f2/zhwz28mn1hd815pc78kg02q80000gp/T/expr5-3b2971..swift:1:72: error: 'XCUIElementQuery' is not a member type of 'XCTest'
Swift._DebuggerSupport.stringForPrintObject(Swift.UnsafePointer<XCTest.XCUIElementQuery>(bitPattern: 0x10c73f4d0)!.pointee)

这确实感觉像是 Xcode 错误。有没有其他人遇到过这种情况?

如果其他人想尝试一下,这里有一些代码。

从视图控制器:

@IBAction func showPressed(_ sender: Any) 
    let text = "I have something to share."

    let vc = UIActivityViewController(activityItems: [text], applicationActivities: nil)
    vc.popoverPresentationController?.sourceView = self.view

    self.present(vc, animated: true, completion: nil)

用户界面测试:

func testActivityViewController() 
    let app = XCUIApplication()
    app.launch()

    app.buttons["Show AVC"].tap()

    let buttons = app.buttons
    let copy = buttons["Copy"]
    sleep(2) // Just keeping things simple for the example.

    XCTAssertTrue(copy.exists)

【问题讨论】:

【参考方案1】:

我不确定这是在哪个版本中修复的,但从 Xcode 版本 11.2.1 (11B500) 开始,UI 元素的配置略有不同。现在,您可以通过以下方式从 UIActivityViewController 访问“复制”按钮:

XCUIApplication().otherElements["ActivityListView"].cells.containing(.label(equals: "Copy")).firstMatch

HT 到 https://***.com/a/48450562/19626 用于 otherElements 选择器。

关闭/取消按钮也移动了。这是我找到它的地方:

XCUIApplication().otherElements["ActivityListView"].buttons["Close"].tap()

【讨论】:

【参考方案2】:

我在 Xcode 11 中也看到了这种行为,我认为您认为这是 Xcode 错误的假设是正确的。

崩溃 似乎已在 Xcode 版本 11.2 beta 2 (11B44) 中得到修复,但在 UIActivityViewController 中查询按钮仍然无法正常工作。 (我从来没有看到元素解析。)希望苹果能在不久的将来修复元素查找。

【讨论】:

为 beta 3 祈祷。

以上是关于在 iOS 13 UI 测试中访问 UIActivityViewController 上的按钮会导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

无法访问 nib 文件中的按钮(UI 测试 iOS)

在 UI 测试期间测试对象状态 (iOS)

如何通过 UI 测试(Xcode 12、iOS14)访问推送通知?

在 iOS 上使用 UI 自动化测试屏幕跟踪

iOS UI 测试:如何获取 UIAlertController 的消息

iOS 14 / UI 测试 DatePicker