如何在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
相关产品推荐
相关产品推荐

