2015-11-23 14 views
26

मुझे एक्सकोड 7 यूआई परीक्षण के साथ एक समस्या का सामना करना पड़ा।एक्सकोड 7 यूआई परीक्षण: पुश और स्थान अलर्ट डिसमिस करें

एप्लिकेशन दो अलर्ट के बाद मेरे उपयोगकर्ता में लॉग करता है, अनुरोध स्थान चेतावनी और पुश सूचनाएं चेतावनी प्रदर्शित करता है। उन अधिसूचनाओं को एक के बाद एक सही दिखाया गया है। स्थान एक पहले प्रकट होता है।

मैं अपने परीक्षण शुरू करने के लिए स्वचालित रूप से उन्हें खारिज करने का प्रयास करता हूं।

ऐसा करने के लिए, मैं दो UIInterruptionMonitor जोड़ता हूं, स्थान अलर्ट के लिए पहला और अधिसूचना पुश अलर्ट के लिए दूसरा वाला।

addUIInterruptionMonitorWithDescription("Location Dialog") { (alert) -> Bool in 
     /* Dismiss Location Dialog */ 
     if alert.collectionViews.buttons["Allow"].exists { 
      alert.collectionViews.buttons["Allow"].tap() 
      return true 
     } 
     return false 
    } 
    addUIInterruptionMonitorWithDescription("Push Dialog") { (alert) -> Bool in 
     /* Dismiss Push Dialog */ 
     if alert.collectionViews.buttons["OK"].exists { 
      alert.collectionViews.buttons["OK"].tap() 
      return true 
     } 
     return false 
    } 

लेकिन केवल स्थान एक शुरू हो रहा है, पुश सूचनाएं का हैंडलर UIInterruptionMonitor कभी नहीं कहा जाता है।

अगर मैं अनुरोध स्थानUIInterruptionMonitorthis other post accepted answer के रूप में निर्दिष्ट में सच लौट आते हैं। दोनों हैंडलर को बुलाया जाता है लेकिन चेतावनी पैरामीटर दोनों UIInterruptionMonitorके लिए लिंक अलर्ट देखें, इसलिए "ठीक" बटन कभी नहीं मिला है।

मैं उन दो लगातार अलर्ट दृश्यों को कैसे खारिज कर सकता हूं?

+3

मैं ठीक उसी मुद्दे से निपटने रहा हूँ "पुश सूचनाएं", लेकिन अभी तक कोई समाधान नहीं मिल गया है। मैंने केवल एक का उपयोग करने की कोशिश की और दोनों में "अनुमति दें" और "ठीक" की जांच की, लेकिन यह काम नहीं किया .... – dustinrwh

+1

मैं अब इस सटीक मुद्दे को कुश्ती कर रहा हूं। क्या आपके पास कोई प्रगति है? तो निराशाजनक – Lizza

+1

मैं इस समस्या से भी अटक गया हूं। एक चेतावनी? कोई बात नहीं। दो लगातार अलर्ट => केवल 1 टैप किया गया है। –

उत्तर

3

जैसा कि मैंने the answer you mentioned में नोट किया है, आपको चेतावनी के बाद आवेदन के साथ बातचीत करनी होगी।

दूसरा, अलर्ट पेश करने के बाद आपको इंटरफ़ेस के साथ बातचीत करनी होगी। बस ऐप को टैप करना ठीक काम करता है, लेकिन इसकी आवश्यकता है। (: पुश अधिसूचना यानी) आप कर सकते हैं define custom flags for the testing environment

// add UI interruption handlers 

app.buttons["Request Location"].tap() 
app.tap() // need to interact with the app for the handler to fire 
+0

मैंने सफलता के बिना, जो भी कहा, मैंने करने की कोशिश की। मेरी समस्या को हल करने के लिए, मुझे दो अलर्ट में से एक को देरी करनी पड़ी। –

+0

बढ़िया! यदि यह आपके लिए काम कर रहा है तो कृपया उत्तर स्वीकार करें ताकि अन्य जान सकें कि इसे उनके लिए काम करना चाहिए। –

+0

आपने देरी कैसे जोड़ा? –

-1

सिस्टम अलर्ट विचारों को खारिज करने के। (: पुश अधिसूचना यानी):

#if !TESTING 
let settings: UIUserNotificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) 
application.registerUserNotificationSettings(settings) 
#endif 

मैं क्रम में इस चाल का उपयोग snapshot साथ स्क्रीनशॉट लेने के लिए सक्षम होना

फिर, आप न केवल विशिष्ट initialisations से बचने के लिए आवेदन के कोड बदलना होगा।

+0

यह प्रश्न का समाधान नहीं करता है, केवल ऐप में क्षमताओं में से एक को अक्षम करता है। –

+0

सवाल यह था: "मैं उन दो लगातार अलर्ट विचारों को कैसे खारिज कर सकता हूं?" – KuiKui

9

आदर्श नहीं होने पर, मैंने पाया कि यदि आप ऐप में किसी अन्य को पेश करने से पहले एक प्राधिकरण संवाद समाप्त हो जाते हैं, तो यूआई परीक्षण एक पंक्ति में कई अनुरोध उठा सकते हैं।

if CLLocationManager.authorizationStatus() == .AuthorizedWhenInUse || CLLocationManager.authorizationStatus() == .AuthorizedAlways { 
     self.locationManager.requestLocation() 
    } else { 
     self.contactStore.requestAccessForEntityType(.Contacts) { _ in 
      self.locationManager.requestWhenInUseAuthorization() 
     } 
    } 

मैं वास्तव में मेरी कोड में एक अलग जगह में संपर्कों पर पहुँच का अनुरोध कर रहा हूँ, लेकिन यह ठीक एकाधिक अनुरोधों को हैंडल कर सकते हैं।

addUIInterruptionMonitorWithDescription("Location Dialog") { (alert) -> Bool in 
     let button = alert.buttons["Allow"] 
     if button.exists { 
      button.tap() 
      return true 
     } 
     return false 
    } 
    addUIInterruptionMonitorWithDescription("Contacts Dialog") { (alert) -> Bool in 
     let button = alert.buttons["OK"] 
     if button.exists { 
      button.tap() 
      return true 
     } 
     return false 
    } 

    app.buttons["Location"].tap() 

    app.tap() // need to interact with the app for the handler to fire 
    app.tap() // need to interact with the app for the handler to fire 
0
class BaseTest: XCTestCase { 
    let pushSent = NSNotification.Name.init("alert.pushSent") 
    var notificationMonitor: NSObjectProtocol? 

    override func setUp() { 
     listenNotifications() 
     let app = XCUIApplication() 

     notificationMonitor = addUIInterruptionMonitor(withDescription: "Push Notifications") { [unowned self] (alert) -> Bool in 
      let btnAllow = app.buttons["Allow"] 
      //1: 
      if btnAllow.exists { 
       btnAllow.tap() 
       NotificationCenter.default.post(name: self.pushSent, object: nil) 
       return true 
      } 
      //2: 
      //takeScreenshot 
      XCTFail("Unexpected System Alert") 
      return false 
     } 
     //3: 
     //add code for "Request Location" monitor 

     app.launchEnvironment = ["UITEST_DISABLE_ANIMATIONS" : "YES"] 
     //4: 
     app.launch() 

    } 

    func listenNotifications() { 
     NotificationCenter.default.addObserver(forName: pushSent, object: nil, queue: nil) { (notification) in 
      if let locationDialogHandeler = self.notificationMonitor { 
       //5: 
       self.removeUIInterruptionMonitor(locationDialogHandeler) 
      } 
     } 
    } 
} 

1:

फिर अपने परीक्षण में

अगर आप सही चेतावनी में हैं की जाँच करें, बटन को टैप करें और मॉनिटर को दूर करने का रास्ता मिल (मैं NotificationCenter उपयोग कर रहा हूँ)

2: यदि आप मॉनिटर दर्ज करते हैं और सही बटन नहीं ढूंढ पा रहे हैं, तो इसका मतलब है कि यह एक अप्रत्याशित प्रवाह है। परीक्षण में विफल हो (लेकिन पहले एक स्क्रीनशॉट लें)।

3: जोड़े अन्य पर नज़र रखता है

4: मैं भी एप्लिकेशन को लॉन्च करने से पहले की निगरानी द्वारा जोड़ा जा रहा। यदि आप अलर्ट प्रकट होने के बाद मॉनिटर जोड़ते हैं, तो यह ट्रिगर नहीं किया जाएगा।

5: मॉनीटर को हटाएं, इस तरह जब एक नई चेतावनी दिखाई देती है, तो स्टैक में अगला मॉनीटर कॉल किया जाएगा।

पी.एस: आप उलटे क्रम में नज़र रखता है जोड़ना चाहिए, इसलिए, जोड़ने "अनुरोध स्थान" के बाद

संबंधित मुद्दे