UIActivityViewControllerのボタンを探すとクラッシュする、iOS 13シミュレータまたはデバイスをターゲットとするXcode 11でXcode UIテストを実行するときに問題が発生している人はいますか?
UIActivityViewControllerに表示されるボタンを確認する複数のUIテストがあります。彼らは期待されるセットアップ作業を行い、次のようなボタンを探します:
_XCTAssertTrue(app.buttons["Copy"].exists)
_
テストはiOS 10、11、12で正常に実行されました。iOS13シミュレーターまたはデバイスで同じテストを実行しようとすると、コードがapp.buttonsにアクセスしようとすると実行が停止し、_Thread 1: signal SIGABRT
_の後にapp.buttonsにアクセスしようとする行でFailed to get matching snapshots: Lost connection to the application (pid 33047).
が続きます。
待機を追加したり、古い学校の睡眠を追加したりしても、何も起こりません。運の悪い要素を見つけるために、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)
}
_
UIテスト:
_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)
}
_
これが修正されたバージョンは正確にはわかりませんが、UI要素はXcodeバージョン11.2.1(11B500)とは少し異なる構成で使用できます。 UIActivityViewControllerから[コピー]ボタンにアクセスする方法は次のとおりです。
XCUIApplication().otherElements["ActivityListView"].cells.containing(.label(equals: "Copy")).firstMatch
OtherElementsセレクターのHTを https://stackoverflow.com/a/48450562/19626 に変更します。
閉じる/キャンセルボタンも移動しました。ここで私はそれを見つけました:
XCUIApplication().otherElements["ActivityListView"].buttons["Close"].tap()