XCTestCase:无法按下导航栏中的自定义栏按钮
XCTestCase: Can't press custom bar button in navigation bar
我正在为 iOS 应用程序编写测试,但无法点击自定义栏按钮。它是一个带有 UIImageView 的条形按钮。
该图像有一个 accessibilityIdentifier = "settingsBarImage"
和
条形按钮有一个 accessibilityIdentifier = "settingsBarButton"
当我用 print(app.debugDescription)
打印小部件树时,按钮存在并且可以点击。
NavigationBar, 0x60000320b480, {{0.0, 44.0}, {375.0, 44.0}}, identifier: 'Overview'
Button, 0x60000320b560, {{16.0, 51.0}, {30.0, 30.0}}, identifier: 'settingsBarButton', label: 'Your profile picture.'
StaticText, 0x60000320b640, {{150.0, 55.7}, {75.0, 20.3}}, label: 'Overview'
我试过:
app.navigationBars.button.firstMatch.tap()
app.navigationBars["Overview"].buttons["settingsBarButton"].tap()
app.buttons["settingsBarButton"].tap()
app.otherElement["settingsBarButton"].tap()
及其所有组合。
结果总是一样的:
t = 14.74s Tap Button
t = 14.74s Wait for com.sap.mobile.apps.ProjectCompanion to idle
t = 14.77s Find the Button
t = 15.82s Find the Button (retry 1)
t = 16.87s Find the Button (retry 2)
t = 16.92s Collecting extra data to assist test failure triage
t = 16.92s Requesting snapshot of accessibility hierarchy for app with pid 89909
t = 16.95s Requesting snapshot of accessibility hierarchy for app with pid 89909
t = 17.06s Assertion Failure: OverviewScreenBase.swift:31: Failed to get matching snapshot: No matches found for first query match sequence: `Descendants matching type NavigationBar` -> `Descendants matching type Button`, given input App element pid: 89909 (no attribute values faulted in)
Possibly caused by runtime issues:
如果有人遇到过这个问题,我将不胜感激。
此致,
鸡
编辑:经过更多试验,我掌握了更多信息。
当 settingsBarButton 由 运行 应用程序正常创建时,isAccessibilityElement
返回 true,但在测试期间,它 returns false。
看起来按钮不是导航栏的子视图。
试试 app.buttons["settingsBarButton"].tap()
。
这个小扩展有时会有帮助。
extension XCUIElement {
func tapUnhittable() {
XCTContext.runActivity(named: "Tap \(self) by coordinate") { _ in
coordinate(withNormalizedOffset: CGVector(dx: 0.0, dy: 0.0)).tap()
}
}
}
尝试app.buttons["settingsBarButton"].tapUnhittable()
也许可以测试一下按钮是否真的有效,或者测试是否正确失败。如果按钮正常工作但测试仍然失败,那么您可能定位了错误的元素。您可以尝试的一件事是尝试直接点击元素:
app.buttons["settingsBarButton"].tap()
如果还是不行,试试:
if app.otherElements["settingsBarButton"].exists {
app.otherElements["settingsBarButton"].tap()
}
另外,可能由于页面正在加载,该元素还没有出现。这种情况下,可以尝试等待元素加载完成,
let settingButton = app.buttons["settingsBarButton"]
let predicate = NSPredicate(format: "exists == true")
let theExpectation = expectation(for: predicate, evaluatedWith: settingButton, handler: nil)
_ = XCTWaiter().wait(for: [theExpectation], timeout: 5)
if settingButton.exists {
settingButton.tap()
}
如果测试仍然失败,可能不是测试问题,按钮点击实际上不起作用。因此,请务必同时检查您的代码。
我正在为 iOS 应用程序编写测试,但无法点击自定义栏按钮。它是一个带有 UIImageView 的条形按钮。
该图像有一个 accessibilityIdentifier = "settingsBarImage"
和
条形按钮有一个 accessibilityIdentifier = "settingsBarButton"
当我用 print(app.debugDescription)
打印小部件树时,按钮存在并且可以点击。
NavigationBar, 0x60000320b480, {{0.0, 44.0}, {375.0, 44.0}}, identifier: 'Overview'
Button, 0x60000320b560, {{16.0, 51.0}, {30.0, 30.0}}, identifier: 'settingsBarButton', label: 'Your profile picture.'
StaticText, 0x60000320b640, {{150.0, 55.7}, {75.0, 20.3}}, label: 'Overview'
我试过:
app.navigationBars.button.firstMatch.tap()
app.navigationBars["Overview"].buttons["settingsBarButton"].tap()
app.buttons["settingsBarButton"].tap()
app.otherElement["settingsBarButton"].tap()
及其所有组合。
结果总是一样的:
t = 14.74s Tap Button
t = 14.74s Wait for com.sap.mobile.apps.ProjectCompanion to idle
t = 14.77s Find the Button
t = 15.82s Find the Button (retry 1)
t = 16.87s Find the Button (retry 2)
t = 16.92s Collecting extra data to assist test failure triage
t = 16.92s Requesting snapshot of accessibility hierarchy for app with pid 89909
t = 16.95s Requesting snapshot of accessibility hierarchy for app with pid 89909
t = 17.06s Assertion Failure: OverviewScreenBase.swift:31: Failed to get matching snapshot: No matches found for first query match sequence: `Descendants matching type NavigationBar` -> `Descendants matching type Button`, given input App element pid: 89909 (no attribute values faulted in)
Possibly caused by runtime issues:
如果有人遇到过这个问题,我将不胜感激。
此致, 鸡
编辑:经过更多试验,我掌握了更多信息。
当 settingsBarButton 由 运行 应用程序正常创建时,isAccessibilityElement
返回 true,但在测试期间,它 returns false。
看起来按钮不是导航栏的子视图。
试试 app.buttons["settingsBarButton"].tap()
。
这个小扩展有时会有帮助。
extension XCUIElement {
func tapUnhittable() {
XCTContext.runActivity(named: "Tap \(self) by coordinate") { _ in
coordinate(withNormalizedOffset: CGVector(dx: 0.0, dy: 0.0)).tap()
}
}
}
尝试app.buttons["settingsBarButton"].tapUnhittable()
也许可以测试一下按钮是否真的有效,或者测试是否正确失败。如果按钮正常工作但测试仍然失败,那么您可能定位了错误的元素。您可以尝试的一件事是尝试直接点击元素:
app.buttons["settingsBarButton"].tap()
如果还是不行,试试:
if app.otherElements["settingsBarButton"].exists {
app.otherElements["settingsBarButton"].tap()
}
另外,可能由于页面正在加载,该元素还没有出现。这种情况下,可以尝试等待元素加载完成,
let settingButton = app.buttons["settingsBarButton"]
let predicate = NSPredicate(format: "exists == true")
let theExpectation = expectation(for: predicate, evaluatedWith: settingButton, handler: nil)
_ = XCTWaiter().wait(for: [theExpectation], timeout: 5)
if settingButton.exists {
settingButton.tap()
}
如果测试仍然失败,可能不是测试问题,按钮点击实际上不起作用。因此,请务必同时检查您的代码。