swift 如何在iOS 14上测试日期选择器?

zxlwwiss  于 2024-01-05  发布在  Swift
关注(0)|答案(2)|浏览(156)

我正在努力修复iOS 14的UI测试,这些测试在DatePicker视图上设置日期。它们以前在iOS 13上运行时没有任何问题,当时它们显示为车轮拾取器。我的代码用于设置不同的车轮,但由于iOS 14上不再有任何车轮,这不再起作用了。
我尝试使用一个小的演示项目,并使用XCode 12记录按钮记录日期的更改,但它不起作用(在Mac OS 10.15.6上),因为在按下日期按钮后出现错误:“时间戳事件匹配错误:未能找到匹配元素”。
我正在寻找的是一个UI测试用例,用于为iOS 14的新日期选择器设置日期:


的数据
以下是我的Demo项目:

import SwiftUI

struct ContentView: View {
    @State private var date = Date()

    var body: some View {
        Form {
            DatePicker(selection: $date, displayedComponents: .date) {
                Text("Date")
            }
        }
    }
}

字符串

4si2a6ki

4si2a6ki1#

问题只是如何在展开的选择器外部点击 * 来关闭它。你可以通过简单的点击来做到这一点,你可以使用扩展来模拟:

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)


您将看到扩展的选择器确实在测试结束之前就关闭了。

b1uwtaje

b1uwtaje2#

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

相关问题