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() }
//            }
//      }
    }
}