如何在Xcode中编写覆盖Facebook登录的UI测试?

Tom*_*ina 5 xcode facebook ios xctest xcode-ui-testing

我想在Xcode中编写一个用于登录的UI测试FBDSKLoginKit.

然而,Facebook iOS SDK使用SFSafariViewController呈现给用户以便对她进行身份验证,遗憾的是,在Xcode 7中无法与SFSafariViewControllerUI测试进行交互.

任何想法如何测试Facebook登录而不与之交互SFSafariViewController

lon*_*tle 2

Swift 3 Xcode 8 更新

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)        
}
Run Code Online (Sandbox Code Playgroud)

扩大:

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

雨燕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
}
Run Code Online (Sandbox Code Playgroud)

就我而言,我还必须处理断言失败:UI 测试失败 - 无法通过 forceTap() 扩展找到按钮错误的命中点:

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

根据这里这篇很棒的博客文章