XCTest 找不到选择器或其任何选择器轮值(SwiftUI + Apple Watch)

问题描述 投票:0回答:1

我有一个苹果手表的计时器应用程序。主屏幕有 2 个选择器。一种用于时间,一种用于背景声音。我正在尝试为两者编写测试,但仍然停留在第一个选择器上。

目标: 测试启动。选择第一个选择器。默认值为 1。我想向上滑动(或以某种方式选择)3 分钟。然后点击开始按钮。然后确保计时器在 3:00 而不是 1:00。

实际结果: 测试启动。 XCTest 找不到选择器,因此无法更改选择器值。当我进入应用程序层次结构时,我看到选择器元素不在层次结构中作为选择器,而是作为其他类型的元素。不仅如此,它还说只有 1 个选择器值,并且它是静态文本类型。我不确定为什么会这样。我在应用程序的 iPhone 版本中有几乎相同的代码,没有这个问题。不仅如此,层次结构仅显示所选值。尽管选择器的值为 1、2、3、4、5、10、15、20、30、45、60,但唯一可用的初始值为 1。 当我尝试使用 swipeUp() 时,它将值设置为 45。我不确定为什么。向上滑动表示在应用层次结构中选择器(值类型为 other NOT picker)只有一个子元素,即标签和标识符值设置为 45 的 StaticText。

这里是选择器的代码:

struct InitialViewTimePicker: View {

    @EnvironmentObject var timerViewModel: TimerViewModel

    var body: some View {
        Picker(selection: self.$timerViewModel.timerModel.timerVal, label: Text("How many minutes?")) {
            ForEach(0..<self.timerViewModel.getTimes().count, id: \.self) {
//                Text("1").tag(1).accessibilityIdentifier("1")
//                Text("2").tag(2).accessibilityIdentifier("2")
//                Text("3").tag(3).accessibilityIdentifier("3")
//                Text("4").tag(4).accessibilityIdentifier("4")
//                Text("5").tag(5).accessibilityIdentifier("5")
// this produces the same result
                Text("\(self.timerViewModel.getTimes()[$0])")
                    .tag(self.timerViewModel.getTimes()[$0])
                    .accessibilityIdentifier("\(self.timerViewModel.getTimes()[$0])")
            }
        }
        .foregroundColor(Color.ColorPrimary)
        .pickerStyle(.wheel)
        .accessibilityIdentifier("TimePicker")
   }
}

这是应用层次结构:

这是最新的测试:

func test_quietMIND_Watch_AppMinutesPicker_CanBeAdjusted(){
   let timePicker = app.otherElements["TimePicker"]
   timePicker.tap()
   timePicker.staticTexts["1"].exists
   print("timePicker.staticTexts[1].exists = \(timePicker.staticTexts["1"].exists)")
   let time = timePicker.staticTexts.matching(identifier: "1")
   timePicker.swipeUp()
   print("\(timePicker.value)")
   print("time.element.exists : \(time.element.exists)")
   let selectedTime = app.otherElements.staticTexts["3"]
   selectedTime.isSelected
   XCTAssertEqual(app.staticTexts.element.label, "03:00")
}

所以是的。我如何告诉应用程序层次结构 ui 元素选择器实际上是一个选择器?我如何确保选择器是一个选择器并且具有它的所有子值?以及如何更改选择器的值?

swiftui apple-watch xctest picker uitest
1个回答
0
投票

看来我找到了解决方法。

.swipeUp()

只是快速向上滑动到接近底部的值。不知道为什么

.swipeUp(velocity: 25)

以所需速度向上滑动一个元素。速度值与滑动次数无关,但它可能非常慢。即使是 25 也比理想的慢。不确定速度是如何确定的或相关的。

当您进入应用程序层次结构时,您会看到

swipeUp()
swipeUp(velocity: Int)
之间存在重大差异。使用常规的
swipeUp()
它只会显示它在应用程序层次结构中滑动到的值。在这种情况下它是 45。但是如果你使用
swipeUp(velocity: Int)
它会列出 all 已经被刷过的元素。所以向上滑动两次将使每个选择器值都被滑动的子 StaticText 元素。所以向上滑动两次显示 1、2 和 3 的子静态文本元素。不知道为什么有区别,但有一个。

任何能解释这是为什么的人将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.