处理位置服务警报的 UITest 用例

UITest cases to handle with location services alert

我正在为我的项目编写 UI 个测试用例。

我的项目流程如下:

因此,当我全新安装应用程序时,此流程会记录在测试用例中,并且如果我在新的全新构建上执行则可以正常工作。

但问题是,当我在旧版本上进行测试时,没有关于位置权限的警报,并且测试失败了。 我如何处理这种情况或在我 运行 测试时每次都请求用户许可?

为了重置用户的凭据,我将 launchArguments 传递给 XCUIApplication() 并在 AppDelegate 中处理。

我已经实现了代码如果方法正确请告诉我:

addUIInterruptionMonitor(withDescription: "Allow “APP” to access your location?") { (alert) -> Bool in
            alert.buttons["Only While Using the App"].tap()

            return true
        }

无论警报是否出现,以上代码都适用。

使用中断监视器是正确的方法。但是,在与警报交互之前检查显示的警报是否是您期望的警报会更安全:

addUIInterruptionMonitor(withDescription: "Allow “APP” to access your location?") { (alert) -> Bool in
    let button = alert.buttons["Only While Using the App"]
    if button.exists {
        button.tap()
        return true // The alert was handled
    }

    return false // The alert was not handled
}

我使用以下代码允许用户定位:

    // MARK: - Setup
    
    override func setUp() {
        super.setUp()
        continueAfterFailure = false
        app = XCUIApplication()
        app.launch()
        addUIInterruptionMonitor(withDescription: "System Dialog") { (alert) -> Bool in
            alert.buttons["Allow Once"].tap()
            return true
        }
    }

在此设置中,我“注册”了用于点击允许按钮的中断监视器,因此在这种情况下我可以关闭该模式。现在,这是我的测试:

    // MARK: - Test change mall
    
    func testChangeMall() {
        let selectorChangeButton = app.buttons["change_mall_button"]
        XCTAssert(selectorChangeButton.exists, "Selector change button does not exist")
        selectorChangeButton.tap()
        app.navigationBars.firstMatch.tap()
        let cell = app.staticTexts["Shopping Centre"]
        XCTAssert(cell.exists, "There's no cell with this title")
        cell.tap()
        sleep(1)
        let label = app.staticTexts["Shopping Centre"]
        XCTAssert(label.exists, "Nothing changes")
    }

在这个测试中,我只是转到一个视图控制器,其中包含一个按位置排序的列表。首先,我需要关闭该位置的系统警报。因此,首先我关闭该模式,然后从我的 TableView 中点击一个单元格。然后,我需要在我的主视图控制器中显示它,所以我关闭了我的视图控制器,我希望得到相同的标题。

编码愉快!

试试这个

    let app2 = XCUIApplication(bundleIdentifier: "com.apple.springboard")
    let button = app2.alerts.firstMatch.buttons["Allow While Using App"]
    button.waitForExistence(timeout: 10)
    button.tap()