私は、Xcode7/iOS 9 で導入された XCUIApplication、XCUIElement、XCUIElementQuery を使用して、アプリの 1 つに対して UI テスト ケースを作成しています。
行き詰まってしまいました。テスト ケースの画面の 1 つに iOS の位置情報サービスが必要です。予想どおり、&ボタンAllow “App name” to access your location while you use the app?
付きの警告で、位置情報サービスの使用を許可するようユーザーに促します。Allow
Don't Allow
問題は、アラートが OS 自体によって表示されるため、アプリケーションの要素サブツリーに存在しないように見えることです。
以下をログに記録しました:
print("XYZ:\(app.alerts.count)")//0
var existence = app.staticTexts["Allow “App Name” to access your location while you use the app?"].exists
print("XYZ:\(existence)")//false
existence = app.buttons["Allow"].exists
print("XYZ:\(existence)") //false
UI レコーディングでも同様のコードが生成されました:
XCUIApplication().alerts["Allow “App Name” to access your location while you use the app?"].collectionViews.buttons["Allow"].tap()
この問題を解決できる API は見つかりませんでした。例:
- 画面上の位置をタップします
- アプリ外でアラートを受け取る
では、どうすればこれを回避できるでしょうか? ロケーション サービスの承認が必要ないようにテスト ターゲットを構成する方法はありますか。
ベストアンサー1
Xcode9 の
let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
let allowBtn = springboard.buttons["Allow"]
if allowBtn.exists {
allowBtn.tap()
}
Xcode 8.3.3
_ = addUIInterruptionMonitor(withDescription: "Location Dialog") { (alert) -> Bool in
alert.buttons["Allow"].tap()
return true
}
app.buttons["Request Location"].tap()
app.tap() // need to interact with the app for the handler to fire
メソッド名がaddUIInterruptionMonitorになり、withDescriptionを引数として受け取るため、少し異なることに注意してください。
Xcode 7.1
Xcode 7.1 では、システムアラートの問題がようやく修正されました。ただし、小さな問題が 2 つあります。
まず、アラートを表示する前に「UI 中断ハンドラー」を設定する必要があります。これは、アラートが表示されたときにそれをどのように処理するかをフレームワークに指示する方法です。
次に、アラートを表示した後、インターフェースを操作する必要があります。アプリをタップするだけでも問題なく動作しますが、必須です。
addUIInterruptionMonitorWithDescription("Location Dialog") { (alert) -> Bool in
alert.buttons["Allow"].tap()
return true
}
app.buttons["Request Location"].tap()
app.tap() // need to interact with the app for the handler to fire
「ロケーション ダイアログ」は、どのハンドラーがアクセスされたかを開発者が識別するのに役立つ単なる文字列であり、アラートの種類に固有のものではありません。
Xcode 7.0
次のようにすると、Xcode 7 Beta 6 で単一の「システムアラート」が解除されます。
let app = XCUIApplication()
app.launch()
// trigger location permission dialog
app.alerts.element.collectionViews.buttons["Allow"].tap()
Beta 6 では UI テストに関する多数の修正が導入されましたが、これはその 1 つであると考えられます。
-element
また、を直接呼び出していることにも注意してください-alerts
。 を呼び出すと-element
、XCUIElementQuery
フレームワークは画面上で一致する要素を「1 つだけ」選択するように強制されます。これは、一度に 1 つしか表示できないアラートに最適です。ただし、ラベルに対してこれを試し、ラベルが 2 つある場合、フレームワークは例外を発生させます。