XCUITest中如何实现非阻塞长按,以便在长按期间校验元素变化?
解决XCUITests中长按操作的非阻塞断言问题
问题场景
编写XCUITests时,遇到页面在长按元素期间发生内容变化的场景,现有测试代码无法在长按过程中验证变化:
let dateElement = app.staticTexts["selected-date"] XCTAssert(dateElement.label == "Today", dateElement.label) tablesQuery.staticTexts["annotation"].press(forDuration: 3) XCTAssert(dateElement.label != "Today", dateElement.label)
由于press(forDuration:)是阻塞调用,测试会停滞3秒,导致第二个断言只能在长按结束后执行,无法验证长按期间的内容变化。
可行解决方案
方法1:异步任务配合XCTWaiter并行验证
将长按操作放入异步后台任务执行,主线程通过XCTWaiter监听元素变化,确保断言在长按期间触发:
let dateElement = app.staticTexts["selected-date"] XCTAssertEqual(dateElement.label, "Today") // 后台执行长按操作 DispatchQueue.global().async { tablesQuery.staticTexts["annotation"].press(forDuration: 3) } // 等待元素label发生变化,超时时间设为小于长按时长 let changeExpectation = XCTNSPredicateExpectation( predicate: NSPredicate(format: "label != 'Today'"), object: dateElement ) XCTWaiter().wait(for: [changeExpectation], timeout: 2) // 验证元素已发生预期变化 XCTAssertNotEqual(dateElement.label, "Today")
方法2:手动模拟长按的生命周期
通过模拟触摸按下、保持、抬起的完整流程,在触摸保持阶段执行断言:
let dateElement = app.staticTexts["selected-date"] XCTAssertEqual(dateElement.label, "Today") let annotationElement = tablesQuery.staticTexts["annotation"] // 触发长按识别(短按后保持触摸) annotationElement.press(forDuration: 0.1) // 等待并验证元素在长按期间的变化 let changeExpectation = XCTNSPredicateExpectation( predicate: NSPredicate(format: "label != 'Today'"), object: dateElement ) XCTWaiter().wait(for: [changeExpectation], timeout: 1) XCTAssertNotEqual(dateElement.label, "Today") // 手动结束长按(触摸抬起) annotationElement.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5)).tap()
内容的提问来源于stack exchange,提问作者Simon McLoughlin
相关产品推荐
相关产品推荐

