Swift iOS 14/UI测试日期选择器
我正在努力修复iOS 14的UI测试,这些测试在日期选择器视图上设置日期。它们之前在iOS 13上运行时没有任何问题,当时它们被显示为车轮选择器。我的代码用来设置不同的控制盘,但由于iOS 14上不再有任何控制盘,因此不再工作 我曾尝试使用一个小的演示项目,并使用XCode 12记录按钮记录日期的更改,但它不起作用(在Mac OS 10.15.6上),因为按下日期按钮后出现错误:“时间戳事件匹配错误:未能找到匹配元素” 我要找的是一个UI测试用例,用于为iOS 14的新日期选择器设置日期: 以下是我的演示项目:Swift iOS 14/UI测试日期选择器,swift,swiftui,xcuitest,ios14,xcode12,Swift,Swiftui,Xcuitest,Ios14,Xcode12,我正在努力修复iOS 14的UI测试,这些测试在日期选择器视图上设置日期。它们之前在iOS 13上运行时没有任何问题,当时它们被显示为车轮选择器。我的代码用来设置不同的控制盘,但由于iOS 14上不再有任何控制盘,因此不再工作 我曾尝试使用一个小的演示项目,并使用XCode 12记录按钮记录日期的更改,但它不起作用(在Mac OS 10.15.6上),因为按下日期按钮后出现错误:“时间戳事件匹配错误:未能找到匹配元素” 我要找的是一个UI测试用例,用于为iOS 14的新日期选择器设置日期: 以
import SwiftUI
struct ContentView: View {
@State private var date = Date()
var body: some View {
Form {
DatePicker(selection: $date, displayedComponents: .date) {
Text("Date")
}
}
}
}
问题只在于如何点击扩展选择器的外部以将其关闭。您只需单击即可完成此操作,您可以使用扩展进行模拟:
extension XCUIApplication {
func tapCoordinate(at point: CGPoint) {
let normalized = coordinate(withNormalizedOffset: .zero)
let offset = CGVector(dx: point.x, dy: point.y)
let coordinate = normalized.withOffset(offset)
coordinate.tap()
}
}
这是一个基于录音的有点幼稚的方法;您可以根据需要进行清理:
func testExample() throws {
let app = XCUIApplication()
app.launch()
XCTAssertTrue(app.cells["Date, Date Picker, Sep 24, 2020"].exists)
app.tables.datePickers.containing(.other, identifier:"Date Picker").element.tap()
app.datePickers.collectionViews.buttons["Friday, September 4"].otherElements.containing(.staticText, identifier:"4").element.tap()
app.tapCoordinate(at: CGPoint(x:30,y:30))
XCTAssertTrue(app.cells["Date, Date Picker, Sep 4, 2020"].exists)
}
当然,这只在今天起作用。但它会让你走的
如果要查看“解除”点击是否有效,请添加延迟:
app.tapCoordinate(at: CGPoint(x:30,y:30))
let delayExpectation = XCTestExpectation()
delayExpectation.isInverted = true
wait(for: [delayExpectation], timeout: 1)
您将看到,扩展的选取器确实在测试结束前关闭。我尝试使用app.按钮[“Show year picker”]访问左上角按钮上的月份和年份。点击此按钮后,将显示另一个日历,但当我尝试使用app.pickerWheels.element(boundBy:1).adjust(toPickerWheelValue:“2020”)调整控制盘时,它会显示错误断言:TestCaseUtilsProvising的断言失败。swift:178:类型6的不受支持的选择器控制盘“2020”。你有什么办法解决这个问题吗?@JeffZhang我正在回答这个问题。如果你有不同的问题,请把它当作一个问题。@matt:谢谢你,我明天会测试这个,并给你反馈!