macOS 上应用程序的元素树中缺少菜单栏弹出窗口
Menu Bar Popover is missing from application's elements tree on macOS
我目前正在尝试为 macOS 菜单栏中带有弹出窗口的应用程序编写简单的 UI 测试。其中一项测试应该打开菜单栏弹出窗口并与其内容进行交互。问题是内容似乎完全不存在于应用程序的元素树中。
我正在这样创建弹出窗口:
let view = MenuBarPopUp()
self.popover.animates = false
self.popover.behavior = .transient
self.popover.contentViewController = NSHostingController(rootView: view)
…和show/hide它在菜单栏上,这样点击:
if let button = statusItem.button {
button.image = NSImage(named: NSImage.Name("MenuBarButtonImage"))
button.action = #selector(togglePopover(_:))
}
@objc func togglePopover(_ sender: AnyObject?) {
if self.popover.isShown {
popover.performClose(sender)
} else {
openToolbar()
}
}
func openToolbar() {
guard let button = menuBarItem.menuBarItem.button else { return }
self.popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY)
NSApp.activate(ignoringOtherApps: true)
}
当我转储元素树时,弹出窗口不存在:
[…]
MenuBar, 0x7fef747219d0, {{1089.0, 1.0}, {34.0, 22.0}}
StatusItem, 0x7fef74721b00, {{1089.0, 1.0}, {34.0, 22.0}}
[…]
当我编译应用程序并四处点击时,一切正常,但当涉及到自动化 UI 测试时,我无法让它正常工作。有什么想法吗?
好吧,在花了很多时间之后,这解决了我的问题。
首先,我必须像这样将 Popover 添加到应用的辅助功能子项中:
var accessibilityChildren = NSApp.accessibilityChildren() ?? [Any]()
accessibilityChildren.append(popover.contentViewController?.view as Any)
NSApp.setAccessibilityChildren(accessibilityChildren)
但是,一开始这似乎并没有解决我的问题。我在 SwiftUI 应用程序中使用 App Delegate。修改它一段时间后,我发现我在 App.swift 中添加的命令与我对 App Delegate 中的可访问性子项所做的更改不太相符。从 Window 组中删除命令后,一切都按预期进行。
@main
struct MyApp: App {
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
// .commands {
// CommandGroup(replacing: CommandGroupPlacement.appSettings) {
// Button("Preferences...") { showPreferences() }
// }
// }
}
}
我目前正在尝试为 macOS 菜单栏中带有弹出窗口的应用程序编写简单的 UI 测试。其中一项测试应该打开菜单栏弹出窗口并与其内容进行交互。问题是内容似乎完全不存在于应用程序的元素树中。
我正在这样创建弹出窗口:
let view = MenuBarPopUp()
self.popover.animates = false
self.popover.behavior = .transient
self.popover.contentViewController = NSHostingController(rootView: view)
…和show/hide它在菜单栏上,这样点击:
if let button = statusItem.button {
button.image = NSImage(named: NSImage.Name("MenuBarButtonImage"))
button.action = #selector(togglePopover(_:))
}
@objc func togglePopover(_ sender: AnyObject?) {
if self.popover.isShown {
popover.performClose(sender)
} else {
openToolbar()
}
}
func openToolbar() {
guard let button = menuBarItem.menuBarItem.button else { return }
self.popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY)
NSApp.activate(ignoringOtherApps: true)
}
当我转储元素树时,弹出窗口不存在:
[…]
MenuBar, 0x7fef747219d0, {{1089.0, 1.0}, {34.0, 22.0}}
StatusItem, 0x7fef74721b00, {{1089.0, 1.0}, {34.0, 22.0}}
[…]
当我编译应用程序并四处点击时,一切正常,但当涉及到自动化 UI 测试时,我无法让它正常工作。有什么想法吗?
好吧,在花了很多时间之后,这解决了我的问题。
首先,我必须像这样将 Popover 添加到应用的辅助功能子项中:
var accessibilityChildren = NSApp.accessibilityChildren() ?? [Any]()
accessibilityChildren.append(popover.contentViewController?.view as Any)
NSApp.setAccessibilityChildren(accessibilityChildren)
但是,一开始这似乎并没有解决我的问题。我在 SwiftUI 应用程序中使用 App Delegate。修改它一段时间后,我发现我在 App.swift 中添加的命令与我对 App Delegate 中的可访问性子项所做的更改不太相符。从 Window 组中删除命令后,一切都按预期进行。
@main
struct MyApp: App {
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
// .commands {
// CommandGroup(replacing: CommandGroupPlacement.appSettings) {
// Button("Preferences...") { showPreferences() }
// }
// }
}
}