Я не могу получить тесты пользовательского интерфейса для переключения Toggle в форме SwiftUI. Кажется, что app.switches[*name*].tap()
ничего не делает. Кто-нибудь еще испытал это? Идеи?
Приведенный ниже код является демонстрацией проблемы. Это простая форма с четырьмя переключателями, которая генерирует значение int на основе позиций переключателей.
У меня есть следующий вид SwiftUI:
struct ContentView: View {
@State var sw1: Bool = false
@State var sw2: Bool = false
@State var sw3: Bool = false
@State var sw4: Bool = false
var valueString: String {
var ret: Int = 0
if sw1 {
ret = ret + 1
}
if sw2 {
ret = ret + 2
}
if sw3 {
ret = ret + 4
}
if sw4 {
ret = ret + 8
}
return String(ret)
}
var body: some View {
NavigationStack {
Form {
Section("Binary switches"){
Toggle("1", isOn: $sw1)
.accessibilityIdentifier("sw1")
Toggle("2", isOn: $sw2)
.accessibilityIdentifier("sw2")
Toggle("4", isOn: $sw3)
.accessibilityIdentifier("sw3")
Toggle("8", isOn: $sw4)
.accessibilityIdentifier("sw4")
}
Section("Value") {
Text(valueString)
.accessibilityIdentifier("value")
.accessibilityValue(valueString)
}
}
.navigationTitle("Test Form")
}
}
}
И следующий код тестирования пользовательского интерфейса:
func testRandomSwitches() throws {
let app = XCUIApplication()
app.launch()
// Get the binary switches
let sw1 = app.switches["sw1"]
let sw2 = app.switches["sw2"]
let sw3 = app.switches["sw3"]
let sw4 = app.switches["sw4"]
// randomly switch on some of the switches
let randomOnes = [sw1, sw2, sw3, sw4].map { _ in Bool.random() }
if randomOnes[0] { sw1.tap() }
if randomOnes[1] { sw2.tap() }
if randomOnes[2] { sw3.tap() }
if randomOnes[3] { sw4.tap() }
// calculate the expected value
let expectedValue = randomOnes.enumerated()
.filter { $0.element }
.map { 1 << $0.offset }
.reduce(0, +)
// get the value text and assert that it matches the expected value
let value = app.staticTexts["value"].value as? String ?? ""
XCTAssertEqual(value, String(expectedValue))
}
Когда я запускаю этот тест, переключатели никогда не переключаются, а строка значения всегда читается как «0». Код UITest не работает на XCTAssertEqual(value, String(expectedValue))
. Я не уверен, что я делаю неправильно.
Если я пытаюсь записать нажатие переключателя, я всегда получаю сообщение об ошибке «Ошибка сопоставления событий с отметкой времени: не удалось найти соответствующий элемент».
Может ли кто-нибудь помочь мне понять, почему переключатели не переключаются в моих тестах пользовательского интерфейса?
К сожалению нет. Ответы предлагают добавить .accessibilityIdentifier()
к переключателю, ведь он у меня уже есть.
Догадаться. Кажется, мне нужно получить доступ к первому коммутатору в коммутаторе. Очень странно. Но я считаю, что тестирование пользовательского интерфейса — это странно. Было бы очень признательно, если бы кто-нибудь получил менее хакерское решение.
Нерабочий код:
sw1.tap()
Рабочий код:
sw1.switches.firstMatch.tap()
Ничего себе, это сделало это и для меня .. спасибо! Никогда бы не догадался!
Это поведение только началось с Xcode 14.3. Возможно, это всегда было преднамеренно для Apple, и сбой только что был исправлен, но кто знает. Спасибо!!!
Отвечает ли это на ваш вопрос? Как правильно написать UI-тест для Swift UI Toggle