You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在XCTestCase中集成Auth0:如何关闭「XXXX想要使用auth0.com登录」安全弹窗

解决XCTest中无法关闭Auth0登录系统弹窗的问题

这个问题我之前帮同事排查过,确实挺头疼的——苹果这款「应用想要使用auth0.com登录」的系统弹窗是专门做了安全限制的,常规的addUIInterruptionMonitor之所以失效,是因为它根本不属于普通的应用内弹窗,而是系统级权限请求弹窗,由Springboard(iOS系统桌面进程)管控,触发逻辑和普通弹窗完全不一样。

可行的解决方案

我试过两种可靠的方法,都能解决这个问题:

方法一:直接操作Springboard进程(推荐)

既然弹窗属于系统进程,我们可以直接获取Springboard的实例来定位并操作弹窗,这是处理系统级弹窗最稳定的方式:

func doUserLogin(_ app: XCUIApplication) {
    app.staticTexts["notLoggedInActivelabel"].tap()
    
    // 获取iOS系统桌面进程Springboard的实例
    let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
    
    // 点击Google登录按钮触发弹窗
    app.scrollViews.otherElements.buttons["LOG IN WITH GOOGLE"].tap()
    
    // 等待系统弹窗出现(超时时间可根据测试环境调整)
    let auth0Alert = springboard.alerts.firstMatch
    XCTAssertTrue(auth0Alert.waitForExistence(timeout: 10), "Auth0登录系统弹窗未按时出现")
    
    // 点击弹窗上的"Continue"按钮(如果是中文测试环境,替换成"继续"即可)
    auth0Alert.buttons["Continue"].tap()
}

方法二:优化UI中断监视器

如果你更倾向于用addUIInterruptionMonitor,需要精准匹配弹窗的标题文本,并且调整触发时机——要确保在点击登录按钮前就注册好监视器,同时给足弹窗加载的时间:

func doUserLogin(_ app: XCUIApplication) {
    app.staticTexts["notLoggedInActivelabel"].tap()
    
    // 提前注册监视器,注意标题要完全匹配弹窗文本(把XXXX换成你的应用名称)
    let handler = addUIInterruptionMonitor(withDescription: "\"XXXX\" Wants to Use \"auth0.com\" to Login") { alert in
        if alert.buttons["Continue"].exists {
            alert.buttons["Continue"].tap()
            return true
        }
        return false
    }
    
    // 触发弹窗
    app.scrollViews.otherElements.buttons["LOG IN WITH GOOGLE"].tap()
    
    // 给弹窗足够的加载时间,再触发监视器
    Thread.sleep(forTimeInterval: 2)
    app.tap()
    
    removeUIInterruptionMonitor(handler)
}

额外提醒

  1. 多语言适配:如果测试需要支持多语言环境,建议不要硬编码按钮文本(比如"Continue"),可以通过按钮的accessibilityIdentifier或者本地化字符串来定位。
  2. 安全合规性:不用担心这种操作违反苹果的安全设计——UI测试是在受控环境中验证应用流程,并非绕过用户的真实授权,完全符合测试场景的需求。

内容的提问来源于stack exchange,提问作者chrisl08

火山引擎 最新活动