如何在 swift UITests 的 XCUIApplication 中设置暗模式?

How to set Dark Mode in XCUIApplication in swift UITests?

我想知道是否有办法在 swift UITests 项目中为 XCUIApplication 在代码中设置暗模式。

我需要在同一测试中以亮模式和暗模式启动应用程序。在方案中将此设置为硬编码值将不起作用,或者从外部破解模拟器也不起作用(出于性能和可维护性等原因)。

目前我这样设置启动参数:

    let app = XCUIApplication()
    var launchArguments: [AnyHashable] = []
    launchArguments.append("-AppleLanguages")
    launchArguments.append(langCode)
    launchArguments.append("-AppleLocale")
    launchArguments.append(localeCode)
    app.launchArguments = launchArguments
    app.launch()

而且效果很好。

如何为 XCUIApplication 实例设置深色模式?

我做了什么:

感谢您的帮助!

在 macOS 中,您可以从 Terminal.app 发出此命令

defaults read NSGlobalDomain AppleInterfaceStyle

响应为

Dark


在您的 XCTestCase 中,这应该有效

    func testAppleInterfaceStyleDark() {
        let app = XCUIApplication()
        var launchArguments: [AnyHashable] = []

        launchArguments.append("-AppleInterfaceStyle")
        launchArguments.append("Dark")
        app.launchArguments = launchArguments as! [String]
        app.launch()
    }

从 Xcode 11.4 Beta 开始更新

您现在可以在模拟器中切换外观。这是测试地图和其他深色模式功能的好方法。

  • 从模拟器菜单项 > 功能 > 切换外观,或 shiftA

Simulator supports toggling appearance for iOS simulators (13.0 and later). From within the app select Debug > Toggle Appearance. From the command line use the simctl ui subcommand, e.g. to set dark appearance

xcrun simctl ui <device> appearance dark

我对这个问题也很感兴趣,因为我正在使用 UI 测试来使用 Fastlane 截取屏幕截图。目标是能够针对同一目标的不同测试在亮模式和暗模式之间切换。

RobLabs 提供的解决方案似乎不适用于 Xcode 11.4 / iOS 13.4。我不确定这是否符合您的要求,但我正在使用自定义启动参数,然后在 SceneDelegate 中设置界面样式,仅用于调试版本:

在你的测试中:

override func testDarkMode() { // use setUp() to affect all test cases
    app = XCUIApplication()  
    app.launchArguments.append("UITestingDarkModeEnabled")
    app.launch()
}

在SceneDelegate.swift中:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    (...)

    #if DEBUG
    if CommandLine.arguments.contains("UITestingDarkModeEnabled") {
        window?.overrideUserInterfaceStyle = .dark
    }
    #endif

    (...)    
}

现在您的测试在黑暗模式下运行。