在Xcode UI Testing中如何检测新scene是否成功创建?
多场景创建校验实现方案
XCTest框架中,不管是Mac Catalyst的多窗口还是iPad的多场景,每个活跃的scene都会对应XCUIApplication的windows数组中的一个元素,我们可以通过统计窗口数量、匹配窗口特征来校验新scene是否创建成功。
实现步骤
- 第一步(前置准备):给你的编辑器场景的根视图添加唯一的可访问性标识,避免统计到系统弹窗、右键菜单等非业务窗口,在你的编辑器根视图控制器的
viewDidLoad中添加如下代码:
view.accessibilityIdentifier = "editor_scene_root"
- 第二步:在测试用例中,先统计触发新建操作前的有效编辑器窗口数量
- 第三步:触发新建操作后,添加异步等待逻辑,校验有效窗口数量是否符合预期,也可以额外校验新窗口的内容特征
完整测试代码示例
func testNewEditor() throws { let app = XCUIApplication() app.launch() // 统计初始编辑器窗口数量 let initialEditorCount = app.windows.containing(.other, identifier: "editor_scene_root").count #if targetEnvironment(macCatalyst) let menuBarsQuery = app.menuBars menuBarsQuery.menuBarItems["File"].click() menuBarsQuery.menuItems["new_editor"].click() #elseif os(iOS) // iPad 平台的新建逻辑示例,可按需补充 app.toolbars.buttons["new_editor"].tap() #endif // 等待新场景创建,超时时间设为3秒可按需调整 let predicate = NSPredicate { _, _ in app.windows.containing(.other, identifier: "editor_scene_root").count == initialEditorCount + 1 } let expectation = expectation(for: predicate, evaluatedWith: nil) let result = XCTWaiter.wait(for: [expectation], timeout: 3) // 校验结果 XCTAssertEqual(result, .completed, "新编辑器场景创建失败") // 可选:额外校验新窗口的内容符合预期,比如新窗口默认标题为"未命名" let newWindow = app.windows.element(boundBy: initialEditorCount) XCTAssertTrue(newWindow.staticTexts["未命名"].waitForExistence(timeout: 1)) }
补充说明
- 如果不需要区分窗口类型,也可以直接用
app.windows.count来统计,但是不推荐,容易受到系统弹窗、临时浮动窗的干扰导致测试用例不稳定 - 如果你需要校验新窗口是活跃的前台窗口,可以访问
XCUIApplication的keyWindow属性,判断其对应的标识是否为编辑器场景
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

