如何为 Swift UI Toggle 正确编写 UI 测试
How to correctly write a UI test for a Swift UI Toggle
有谁知道如何为 Toggle 正确编写 UI 测试?即使在一个只有 Toggle 的全新项目中,整个 UI 中没有其他任何东西,我也会不断收到此类错误:
Failed to get matching snapshot: Multiple matching elements found for <XCUIElementQuery: 0x60000108c410>.
Sparse tree of matches:
→Application, pid: 26580, label: 'TestToggle'
↳Window (Main)
↳Other
↳Other
↳Other
↳Other
↳Switch, label: 'Test switch', value: 1
↳Switch, label: 'Test switch', value: 1
UI 看起来像这样:
struct ContentView: View {
@State private var toggleValue = true
var body: some View {
Toggle("Test switch", isOn: $toggleValue)
.padding()
}
}
测试看起来像这样(这两行中的任何一行都给我同样的错误):
func testExample() throws {
let app = XCUIApplication()
app.launch()
XCTAssertTrue(app.switches["Test switch"].value as? String == "1")
// XCTAssertTrue(app.switches["Test switch"].isEnabled)
}
我肯定做错了什么。如果只有一个开关,怎么会出现两个? None 的在线文章似乎提到了我所看到的任何相关内容。任何帮助表示赞赏。谢谢:)
我在一些 Slack 频道中收到了一些回复,事实证明,出于某种原因,使用 Toggle 我不能依赖默认标签进行测试(与 Text 和 Button 不同),需要创建自定义辅助功能标识符.
所以只需添加如下内容:
Toggle("Test switch", isOn: $toggleValue)
.padding()
.accessibilityIdentifier("testSwitch")
然后像这样测试有效:
func testExample() throws {
let app = XCUIApplication()
app.launch()
XCTAssertTrue(app.switches["testSwitch"].isEnabled)
}
我不确定你为什么会收到你收到的错误,但你可以尝试将 accessibilityIdentifier
添加到 Toggle 并找到它。
例如:
struct ContentView: View {
@State private var toggleValue = true
var body: some View {
Toggle("Test switch", isOn: $toggleValue)
.padding()
.accessibilityIdentifier("testSwitch")
}
}
然后在您的测试中,您可以找到具有以下元素的元素:
func testExample() throws {
let app = XCUIApplication()
app.launch()
XCTAssertTrue(app.switches["testSwitch"].value as? String == "1")
}
顺便说一句,如果您想测试 Toggle 是打开还是关闭,您应该而不是使用isEnabled
。这将检查“是否为用户交互启用了该元素。”
你应该使用
app.switches["testSwitch"].value as? String == "1" // on
或
app.switches["testSwitch"].value as? String == "0" // off
取决于你想测试什么。
有谁知道如何为 Toggle 正确编写 UI 测试?即使在一个只有 Toggle 的全新项目中,整个 UI 中没有其他任何东西,我也会不断收到此类错误:
Failed to get matching snapshot: Multiple matching elements found for <XCUIElementQuery: 0x60000108c410>.
Sparse tree of matches:
→Application, pid: 26580, label: 'TestToggle'
↳Window (Main)
↳Other
↳Other
↳Other
↳Other
↳Switch, label: 'Test switch', value: 1
↳Switch, label: 'Test switch', value: 1
UI 看起来像这样:
struct ContentView: View {
@State private var toggleValue = true
var body: some View {
Toggle("Test switch", isOn: $toggleValue)
.padding()
}
}
测试看起来像这样(这两行中的任何一行都给我同样的错误):
func testExample() throws {
let app = XCUIApplication()
app.launch()
XCTAssertTrue(app.switches["Test switch"].value as? String == "1")
// XCTAssertTrue(app.switches["Test switch"].isEnabled)
}
我肯定做错了什么。如果只有一个开关,怎么会出现两个? None 的在线文章似乎提到了我所看到的任何相关内容。任何帮助表示赞赏。谢谢:)
我在一些 Slack 频道中收到了一些回复,事实证明,出于某种原因,使用 Toggle 我不能依赖默认标签进行测试(与 Text 和 Button 不同),需要创建自定义辅助功能标识符.
所以只需添加如下内容:
Toggle("Test switch", isOn: $toggleValue)
.padding()
.accessibilityIdentifier("testSwitch")
然后像这样测试有效:
func testExample() throws {
let app = XCUIApplication()
app.launch()
XCTAssertTrue(app.switches["testSwitch"].isEnabled)
}
我不确定你为什么会收到你收到的错误,但你可以尝试将 accessibilityIdentifier
添加到 Toggle 并找到它。
例如:
struct ContentView: View {
@State private var toggleValue = true
var body: some View {
Toggle("Test switch", isOn: $toggleValue)
.padding()
.accessibilityIdentifier("testSwitch")
}
}
然后在您的测试中,您可以找到具有以下元素的元素:
func testExample() throws {
let app = XCUIApplication()
app.launch()
XCTAssertTrue(app.switches["testSwitch"].value as? String == "1")
}
顺便说一句,如果您想测试 Toggle 是打开还是关闭,您应该而不是使用isEnabled
。这将检查“是否为用户交互启用了该元素。”
你应该使用
app.switches["testSwitch"].value as? String == "1" // on
或
app.switches["testSwitch"].value as? String == "0" // off
取决于你想测试什么。