You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在XCTest中点击navigationItem返回按钮?获取按钮对象返回nil

在XCTest中点击导航返回按钮的可行方案

我之前也踩过这个坑!直接通过navigationItem的leftBarButtonItem或者backBarButtonItem拿返回按钮经常返回nil,这是因为系统默认的返回按钮并不是直接暴露在这些属性里的——默认返回按钮是由UINavigationController自动生成的,leftBarButtonItem只有你手动自定义返回按钮时才会有值;而backBarButtonItem是上一个页面的navigationItem设置的,当前页面的这个属性本来就是nil。

给你几个靠谱的解决办法:

方法1:通过UI测试的accessibility元素定位(最推荐)

系统默认的返回按钮自带accessibility标签,你可以直接通过按钮文本或者自定义的accessibilityIdentifier来定位点击:

// 方式A:用默认的返回按钮文本(注意本地化,比如中文是"返回")
let backButton = XCUIApplication().navigationBars.buttons["Back"]
backButton.tap()

// 方式B:给返回按钮设置自定义accessibilityIdentifier(推荐,避免本地化问题)
// 在业务代码里给上一个页面的navigationItem设置:
// previousVC.navigationItem.backBarButtonItem?.accessibilityIdentifier = "CustomBackButton"
// 然后在测试代码里:
let customBackButton = XCUIApplication().navigationBars.buttons["CustomBackButton"]
customBackButton.tap()

方法2:遍历导航栏子视图查找返回按钮(适合单元测试场景)

如果是在单元测试里,需要直接操作VC的视图层级,可以遍历导航栏的子视图,通过accessibilityLabel或者按钮样式来找到返回按钮:

guard let navBar = vc.navigationController?.navigationBar else { return }
for subview in navBar.subviews {
    // 系统返回按钮是UIButton,且accessibilityLabel通常为"Back"(或对应本地化文本)
    if let backButton = subview as? UIButton, 
       backButton.accessibilityLabel == "Back" {
        backButton.sendActions(for: .touchUpInside)
        break
    }
}

⚠️ 注意:这个方法依赖系统的视图结构,iOS版本更新可能会失效,优先用方法1。

方法3:模拟左滑返回手势

因为导航控制器默认支持左滑返回,你可以在UI测试里模拟这个手势:

let app = XCUIApplication()
// 导航栏左侧位置开始,向右滑动
let startCoord = app.coordinate(withNormalizedOffset: .zero).withOffset(CGPoint(x: 10, y: 60))
let endCoord = app.coordinate(withNormalizedOffset: .zero).withOffset(CGPoint(x: app.frame.width - 10, y: 60))
startCoord.press(forDuration: 0.1, thenDragTo: endCoord)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:35:27