How to write UI tests covering login with Facebook in Xcode?

前端 未结 2 1272
孤独总比滥情好
孤独总比滥情好 2021-02-06 11:07

I would like to write a UI test in Xcode covering a login with FBDSKLoginKit.

However, Facebook iOS SDK uses SFSafariViewController presented to the user in order to aut

相关标签:
2条回答
  • 2021-02-06 11:40

    Swift 3 Xcode 8 solution

     func testFacebookLogin() {
        let app = XCUIApplication()
    
        // set up an expectation predicate to test whether elements exist
        let exists = NSPredicate(format: "exists == true")
    
        // as soon as your sign in button shows up, press it
        let facebookSignInButton = app.buttons["Login With Facebook"]
        expectation(for: exists, evaluatedWith: facebookSignInButton, handler: nil)
        facebookSignInButton.tap()
    
        // wait for the "Confirm" title at the top of facebook's sign in screen
        let confirmTitle = app.staticTexts["Confirm"]
        expectation(for: exists, evaluatedWith: confirmTitle, handler: nil)
    
        // create a reference to the button through the webView and press it
        let webView = app.descendants(matching: .webView)
        webView.buttons["OK"].tap()
    
        // wait for your app to return and test for expected behavior here
        self.waitForExpectations(timeout: 10, handler: nil)        
    }
    

    Extension:

    extension XCUIElement {
        func forceTap() {
            if self.isHittable {
                self.tap()
            } else {
                let coordinate: XCUICoordinate = self.coordinate(withNormalizedOffset: .zero)
                coordinate.tap()
            }
        }
    }
    

    Tested and verified to work great!

    0 讨论(0)
  • 2021-02-06 11:46

    Swift 3 Xcode 8 update

    func testFacebookLogin() {
      let app = XCUIApplication()
    
      // set up an expectation predicate to test whether elements exist
      let exists = NSPredicate(format: "exists == true")
    
      // as soon as your sign in button shows up, press it
      let facebookSignInButton = app.buttons["Login With Facebook"]
      expectation(for: exists, evaluatedWith: facebookSignInButton, handler: nil)
      facebookSignInButton.tap()
    
      // wait for the "Confirm" title at the top of facebook's sign in screen
      let confirmTitle = app.staticTexts["Confirm"]
      expectation(for: exists, evaluatedWith: confirmTitle, handler: nil)
    
      // create a reference to the button through the webView and press it
      let webView = app.descendants(matching: .webView)
      webView.buttons["OK"].tap()
    
      // wait for your app to return and test for expected behavior here
      self.waitForExpectations(timeout: 10, handler: nil)        
    }
    

    Extension:

    extension XCUIElement {
      func forceTap() {
          if self.isHittable {
              self.tap()
          } else {
              let coordinate: XCUICoordinate = self.coordinate(withNormalizedOffset: .zero)
              coordinate.tap()
          }
      }
    

    Swift 2

    func testFacebookLogin() 
    {
        let app = XCUIApplication()
    
        // set up an expectation predicate to test whether elements exist
        let exists = NSPredicate(format: "exists == true")
    
        // as soon as your sign in button shows up, press it
        let facebookSignInButton = app.buttons["Sign in with Facebook"]
        expectationForPredicate(exists, evaluatedWithObject: facebookSignInButton, handler: nil)
        facebookSignInButton.tap()
    
        // wait for the "Confirm" title at the top of facebook's sign in screen
        let confirmTitle = app.staticTexts["Confirm"]
        expectationForPredicate(exists, evaluatedWithObject: confirmTitle, handler: nil)
    
        // create a reference to the button through the webView and press it
        var webView = app.descendantsMatchingType(.WebView)
        webView.buttons["OK"].tap()
    
        // wait for your app to return and test for expected behavior here
    }
    

    In my case, I also had to deal with the Assertion Failure: UI Testing Failure - Unable to find hit point for Button error via the forceTap() extension:

    extension XCUIElement {
        func forceTap() {
            if self.hittable {
                self.tap()
            } else {
                let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.0, 0.0))
                coordinate.tap()
            }
        }
    }
    

    as per this awesome blog post here

    0 讨论(0)
提交回复
热议问题