Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift iOS 14/UI测试日期选择器_Swift_Swiftui_Xcuitest_Ios14_Xcode12 - Fatal编程技术网

Swift iOS 14/UI测试日期选择器

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的新日期选择器设置日期: 以

我正在努力修复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:谢谢你,我明天会测试这个,并给你反馈!