iOS 14 / UI 测试 DatePicker

Posted

技术标签:

【中文标题】iOS 14 / UI 测试 DatePicker【英文标题】:iOS 14 / UI Testing DatePicker 【发布时间】:2020-09-17 09:23:21 【问题描述】:

我正在努力修复在 DatePicker 视图上设置日期的 iO​​S 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的主要内容,如果未能解决你的问题,请参考以下文章

DatePicker 在 iOS 上不显示?

如何通过 UI 测试(Xcode 12、iOS14)访问推送通知?

在新的 DatePicker (iOS14) 中更改字体颜色

SwiftUI iOS 14 中 DatePicker 的中心对齐

jQuery UI Datepicker 在 iOS 上不起作用

如何触发 jQuery UI DatePicker onclick?