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

The*_*eff 5 ios-simulator swift xcuitest

我想知道是否有办法在 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()
Run Code Online (Sandbox Code Playgroud)

而且效果很好。

如何为 XCUIApplication 实例设置暗模式?

我所做的:

  • 广泛搜索 Apple 开发文档。
  • StackOverflow 只展示了如何在 Xcode 中的方案中对此进行硬编码,或者如何通过杀死模拟器、擦除它并破解 plist 值来从外部破解模拟器。

谢谢你的帮助!

小智 9

我也对这个问题感兴趣,因为我正在使用 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()
}
Run Code Online (Sandbox Code Playgroud)

在 SceneDelegate.swift 中:

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

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

    (...)    
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您使用 fastlane,一种更简单的方法是在配置中使用内置的暗模式标志。在这里搜索 dark_mode:https://docs.fastlane.tools/actions/capture_ios_screenshots/ (3认同)
  • @TheJeff 虽然 fastlane 更容易,但据我所知,没有办法让一张屏幕截图使用黑暗模式。如果您想要一张“支持深色模式”屏幕截图,Peter 的解决方案效果更好,因为它可以针对一个测试用例进行配置。它似乎也比依赖模拟器的参数要脆弱得多,这些参数没有记录并且似乎经常变化 (3认同)

Rob*_*abs 2

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

\n
defaults read NSGlobalDomain AppleInterfaceStyle\n
Run Code Online (Sandbox Code Playgroud)\n

其响应为

\n
\n

黑暗的

\n
\n
\n

在你的XCTestCase,这应该有效

\n
    func testAppleInterfaceStyleDark() {\n        let app = XCUIApplication()\n        var launchArguments: [AnyHashable] = []\n\n        launchArguments.append("-AppleInterfaceStyle")\n        launchArguments.append("Dark")\n        app.launchArguments = launchArguments as! [String]\n        app.launch()\n    }\n
Run Code Online (Sandbox Code Playgroud)\n
\n

从 Xcode 11.4 Beta 开始更新

\n

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

\n
    \n
  • 从模拟器菜单项 > 功能 > 切换外观,或者shift\xe2\x8c\x98A
  • \n
\n
\n

模拟器支持切换 iOS 模拟器(13.0 及更高版本)的外观。从应用程序内选择“调试”>“切换外观”。从命令行使用子命令simctl ui,例如设置深色外观

\n
\n
xcrun simctl ui <device> appearance dark\n
Run Code Online (Sandbox Code Playgroud)\n

  • 这种使用启动参数设置暗模式的方法对我来说不起作用 - 在 iOS 13.3 模拟器上进行 Xcode 11.3.1 测试。 (5认同)
  • 不幸的是,在我的测试中它不起作用。该应用程序仍然在模拟器中以轻型模式启动。这段代码应该适用于 XCUITest 吗? (3认同)