我有一个苹果手表的计时器应用程序。主屏幕有 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 元素选择器实际上是一个选择器?我如何确保选择器是一个选择器并且具有它的所有子值?以及如何更改选择器的值?
看来我找到了解决方法。
.swipeUp()
只是快速向上滑动到接近底部的值。不知道为什么
.swipeUp(velocity: 25)
以所需速度向上滑动一个元素。速度值与滑动次数无关,但它可能非常慢。即使是 25 也比理想的慢。不确定速度是如何确定的或相关的。
当您进入应用程序层次结构时,您会看到
swipeUp()
和 swipeUp(velocity: Int)
之间存在重大差异。使用常规的swipeUp()
它只会显示它在应用程序层次结构中滑动到的值。在这种情况下它是 45。但是如果你使用 swipeUp(velocity: Int)
它会列出 all 已经被刷过的元素。所以向上滑动两次将使每个选择器值都被滑动的子 StaticText 元素。所以向上滑动两次显示 1、2 和 3 的子静态文本元素。不知道为什么有区别,但有一个。
任何能解释这是为什么的人将不胜感激。