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

不问归期 提交于 2019-12-03 03:42:44
thexande

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!

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!