XCTestCase с Auth0: как отключить предупреждение системы безопасности «XXXX» хочет использовать «auth0.com» для входа - PullRequest
0 голосов
/ 30 мая 2018

Совсем недавно Apple представила это приглашение: «XXXX» хочет использовать «auth0.com» для входа в систему, где «XXXX» - это имя приложения ios.

enter image description here

Это предупреждение / диалоговое окно появляется, когда в случае Auth0 пользователь нажимает «Войти через Google» или «Войти через Facebook».Это все хорошо, но при запуске тестов пользовательского интерфейса IOS это диалоговое окно не исчезает при использовании обычного способа отклонения системных диалогов:

func doUserLogin(_ app: XCUIApplication) {

    app.staticTexts["notLoggedInActivelabel"].tap()
    // this will bring up oauth0 login window in ios

    // setup a handler to dismiss the system alert
    let handler = self.addUIInterruptionMonitor (withDescription: "allow oauth") { (alert) -> Bool in
        // code should come here where the dialog is presented, 
        // but it never does ....   
        alert.buttons["Continue"].tap() // click Continue Button 
        return true
    }

    // click the login with GOOGLE button. This brings up dialog “XXXX” Wants to Use “auth0.com” to Login
    app.scrollViews.otherElements.buttons["LOG IN WITH GOOGLE"].tap()

    // this step is required when using addUIInterruptionMonitor
    app.tap()

    removeUIInterruptionMonitor(handler)
}

Мне это как-то понятно: это диалоговое окно системы безопасности введеноApple, чтобы улучшить безопасность.Легкое отклонение этого кода в коде может нанести ущерб цели.
Но, тем не менее, кто-нибудь знает, можно ли закрыть этот диалог в XCTestCase?

1 Ответ

0 голосов
/ 13 ноября 2018

Я думаю, что Apple ожидает от разработчика использования представленного addUIInterruptionMonitor .

На самом деле addUIInterruptionMonitor(withDescription: ) не работает, поэтому я пошел по дороге, чтобы получить доступ кТрамплин и выберите соответствующее разрешение в системном оповещении.

1.Расширен XCTestCase для повторного использования этой функции, если необходимо

extension XCTestCase {

    // I hope this code is mostly reusable
    // I didn't test it for Location Permission While in Use vs. Always...
    func setPermission(for alert:XCUIElement, allow: Bool) -> Bool {
        if alert.elementType == .alert {

            // make sure to support any language
            // Might also be "allow" for some dialogs
            let buttonIdentifier = allow ? "Continue" : "Cancel"
            let identifierButton = alert.buttons[buttonIdentifier]
            if identifierButton.exists && identifierButton.isHittable {
                identifierButton.tap()
                return true
            }

            // Or, if you don't want to bother with the language/identifiers
            // Allow = Last button Index (probably 1), Cancel = 0
            let buttonIndex = allow ? alert.buttons.count - 1 : 0
            let indexButton = alert.buttons.element(boundBy: buttonIndex)
            if indexButton.exists && indexButton.isHittable {
                indexButton.tap()
                return true
            }
        }
        return false
    }
}

2.Вызовите эту функцию в своем тесте как

// This holds a reference to your SignIn/Login XCUIElement
yourSignInButton.tap()

let systemAlerts = XCUIApplication(bundleIdentifier: "com.apple.springboard").alerts
if systemAlerts.count > 0 {
    _ = self.setPermission(for: systemAlerts.element(boundBy: 0), allow: true)
}

Необязательно: класс Springboard

Я также создал класс Springboard, так как у меня также есть тесты системных настроек и т. Д.. running ...

class Springboard {
    static let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
}

Таким образом, вы можете назвать свой XCUITestCase добавочный номер следующим образом:

let systemAlerts = Springboard.springboard.alerts
if systemAlerts.count > 0 {
    self.setPermission(for: systemAlerts.element(boundBy: 0), allow: true)
}

Если addUIInterruptionMonitor(withDescription: ) действительно работалтогда это может выглядеть следующим образом:

Внимание: в настоящее время работает только для уведомлений о авторизации / разрешении местоположения, микрофона и т. д.

let interruptionMonitor = addUIInterruptionMonitor(withDescription: "Allow the app and website to share information") { (alert) -> Bool in
    return self.setPermission(for: systemAlerts.element(boundBy: 0), allow: true)
}

// This holds a reference to your SignIn/Login XCUIElement
yourSignInButton.tap()

removeUIInterruptionMonitor(interruptionMonitor)
...