新增启动参数直达首页与个人中心页面,引入 AppUITestRouteDriver 与 UITestSession 共享登录,并重构各模块用例的导航断言逻辑。 Co-authored-by: Cursor <cursoragent@cursor.com>
50 lines
1.6 KiB
Swift
50 lines
1.6 KiB
Swift
//
|
||
// TabBarNavigator.swift
|
||
// suixinkanUITests
|
||
//
|
||
// Created by Codex on 2026/6/26.
|
||
//
|
||
|
||
import XCTest
|
||
|
||
/// 主 Tab 导航封装。
|
||
enum TabBarNavigator {
|
||
enum Tab: String, CaseIterable {
|
||
case home = "首页"
|
||
case orders = "订单"
|
||
case statistics = "数据"
|
||
case profile = "我的"
|
||
}
|
||
|
||
/// 切换到指定 Tab 并等待页面稳定。
|
||
static func select(_ tab: Tab, app: SuixinkanApp, file: StaticString = #filePath, line: UInt = #line) {
|
||
let button = bottomTabButton(named: tab.rawValue, in: app)
|
||
XCTAssertTrue(button.waitForExistence(timeout: 8), "未找到 Tab:\(tab.rawValue)", file: file, line: line)
|
||
button.tap()
|
||
app.waitForGlobalLoadingToDisappear()
|
||
}
|
||
|
||
/// 在底部自定义 TabBar 中定位唯一可点击的 Tab 按钮。
|
||
private static func bottomTabButton(named title: String, in app: SuixinkanApp) -> XCUIElement {
|
||
let candidates = app.application.buttons.matching(NSPredicate(format: "label == %@", title))
|
||
let screenHeight = app.application.windows.element(boundBy: 0).frame.height
|
||
var bestMatch: XCUIElement?
|
||
var bestY: CGFloat = -1
|
||
|
||
for index in 0..<candidates.count {
|
||
let candidate = candidates.element(boundBy: index)
|
||
guard candidate.exists else { continue }
|
||
|
||
let midY = candidate.frame.midY
|
||
guard midY > screenHeight * 0.72 else { continue }
|
||
|
||
if midY > bestY {
|
||
bestMatch = candidate
|
||
bestY = midY
|
||
}
|
||
}
|
||
|
||
return bestMatch ?? candidates.firstMatch
|
||
}
|
||
}
|