2016-12-23 16 views
0

システム警告を消す方法を考えましたが、システムアラートが表示されないので、表示するのを待つことができません。私はapp.debugDescriptionとapp.alerts.countでデバッグしようとしましたが、運はありませんでした。位置アラート(システムアラート)が表示されるのを待つ方法

+0

:自動化を使用して、システムのアラートに対処する方法の詳細例については

はに見てください?を参照してください:[質問]。 [MCVe]を投稿してください。あなたはまた、尋ねる前に2分間のサイトツアーを完了させるのに気にしませんでした。 –

答えて

0

addUIInterruptionMonitor:withDescription:handler:を使用して割り込みモニタを登録します。システムアラートが表示されるのを待つには、処理されたときにハンドラを使用して変数を設定し、アラートを待つときにアプリケーションとのやり取りを実行します。

対話はトリガー割り込みの監視対象であるため、待機中は引き続きアプリケーションと対話する必要があります。 @Olethaが書いたよう

class MyTests: XCTestCase { 

    let app = XCUIApplication() 

    func testLocationAlertAppears() { 
     var hasDismissedLocationAlert = false 
     let monitor = addUIInterruptionMonitor(withDescription: "LocationPermissions") { (alert) in 
      // Check this alert is the location alert 
      let location = NSPredicate(format: "label CONTAINS 'Location'") 
      if alert.staticTexts.element(matching: location).exists { 
       // Dismiss the alert 
       alert.buttons["Allow"].tap() 
       hasDismissedLocationAlert = true 
       return true 
      } 
      return false 
     } 

     // Wait for location alert to be dismissed 
     var i = 0 
     while !hasDismissedLocationAlert && i < 20 { 
      // Do some benign interaction 
      app.tap() 
      i += 1 
     } 

     // Clean up 
     removeUIInterruptionMonitor(monitor) 

     // Check location alert was dismissed 
     XCTAssertTrue(hasDismissedLocationAlert) 
    } 
} 
+0

おかげでオレサ! –

7

あなたはaddUIInterruptionMonitorを使用する必要があります。

ここで難しいのは、システムアラートボタンがアクセシビリティ識別子を使用しないため、テキストを検索してタップする必要があることです。このテキストは、シミュレータ/デバイスを実行している言語に翻訳されています。これは、英語の横にある複数の言語のテストを実行する場合には難しい場合があります。

簡略化するためにAutoMate frameworkを使用できます。 locationAlert.allowElement.tap()上記の例では

func locationWhenInUse() { 
    let token = addUIInterruptionMonitor(withDescription: "Location") { (alert) -> Bool in 
     guard let locationAlert = LocationWhenInUseAlert(element: alert) else { 
      XCTFail("Cannot create LocationWhenInUseAlert object") 
      return false 
     } 

     locationAlert.allowElement.tap() 
     return true 
    } 

    // Interruption won't happen without some kind of action. 
    app.tap() 
    // Wait for given element to appear 
    wait(forVisibilityOf: locationPage.requestLabel) 
    removeUIInterruptionMonitor(token) 
} 

自動化は、iOSシミュレータでサポートされている任意の言語を扱うことができるので、可能である:ここでは、自動化を使用して、システムのアラートに対処する方法の例を持っています。あなたがこれまでに試してみました何PermissionsTests.swift

関連する問題