iOS 14 / UI 测试 DatePicker
Posted
技术标签:
【中文标题】iOS 14 / UI 测试 DatePicker【英文标题】:iOS 14 / UI Testing DatePicker 【发布时间】:2020-09-17 09:23:21 【问题描述】:我正在努力修复在 DatePicker 视图上设置日期的 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")
【问题讨论】:
【参考方案1】:问题只是如何在扩展的选择器之外点击 以将其关闭。你可以通过简单的点击来做到这一点,你可以使用扩展来模拟:
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.buttons["Show year picker"] 访问左上角按钮上的月份和年份。点击后,显示另一个日历,但是当我尝试使用 app.pickerWheels.element(boundBy: 1).adjust(toPickerWheelValue: "2020") 调整***时,它显示错误 Assertions: Assertion Failure at TestCaseUtilsProviding.swift: 178:不支持的拾取轮“2020”类型 6 PickerWheel。你有解决这个问题的想法吗? @JeffZhang 我正在回答这个问题。如果您有不同的问题,请将其作为问题。 @matt:谢谢你,我明天会测试这个并给你反馈!【参考方案2】:Matt's answer 可能适用于 iOS 14 设备,但不适用于我在 iOS 15.2 设备上。我面临的问题是日历样式的弹出窗口没有被解雇。经过几个小时的反复试验,我发现关闭弹出窗口的代码与显示它的代码相同。
就我而言,我在我的应用程序中声明了DatePicker
,如下所示:
DatePicker("Date Selected", selection: $selectedDate, displayedComponents: [.date])
.accessibilityIdentifier("DatePicker")
.datePickerStyle(.compact)
然后,在我的 UI 测试中,我正在执行以下操作:
// 1. Show the DatePicker popup
application.datePickers["DatePicker"].tap()
// 2. Choose a date in the popup
application.datePickers.collectionViews.buttons["Friday, January 14"].tap()
// 3. Dismiss the DatePicker popup
application.datePickers["DatePicker"].tap()
我已经组装了一个最小的 SwiftUI 应用程序来演示这个here。
【讨论】:
以上是关于iOS 14 / UI 测试 DatePicker的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 UI 测试(Xcode 12、iOS14)访问推送通知?
在新的 DatePicker (iOS14) 中更改字体颜色
SwiftUI iOS 14 中 DatePicker 的中心对齐