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

Posted

技术标签:

【中文标题】如何在 swift UITests 中的 XCUIApplication 中设置暗模式?【英文标题】:How to set Dark Mode in XCUIApplication in swift UITests? 【发布时间】:2020-04-14 07:25:16 【问题描述】:

我想知道是否有办法在 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 实例设置暗模式?

我做了什么:

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

感谢您的帮助!

【问题讨论】:

也许这有帮助:***.com/questions/57988687/… 不,不是。我更新了这个问题,以明确说明通过关闭模拟器、擦除模拟器并插入 plist 值来从外部入侵模拟器并不是指示 XCUIAApplicuion 以暗模式启动的解决方案——这是问题的前提。也已经提到在 XCode UI 中的方案中设置它也不是一个选项。 尝试的潜在论据:-AppleInterfaceStyle Dark。我从defaults read NSGlobalDomain AppleInterfaceStyle 找到了这个论点。但需要经过测试才能验证。 @RobLabs 你就是男人! (或者我不知道的女人)。无论如何,这行得通。如果您将此添加到答案中,我会接受它。当你说你在哪里找到它时,我有点困惑 - 这是一个命令吗?或者它是xcode中的东西?感谢您提供任何其他信息:) @TheJeff,我个人需要更多了解如何在 XCUIApplication 中使用 launchArguments,但这应该可行:launchArguments.append("-AppleInterfaceStyle Dark") 【参考方案1】:

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

defaults read NSGlobalDomain AppleInterfaceStyle

哪个响应

黑暗


在您的 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

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

xcrun simctl ui <device> appearance dark

【讨论】:

请@TheJeff 根据我几天前的原始评论进行测试。 谢谢 Rob,非常有帮助 - 但在任何地方都找不到。 不幸的是,在我的测试中它不起作用。该应用程序仍然在模拟器中以灯光模式启动。此代码是否适用于 XCUITest? 是的。您是否将 Xcode 11(当前 11.3.1)与运行 iOS 13 的更新/当前模拟器一起使用?您是否使用当前的 swift 5 代码进行编译?您是否尝试过重置您正在运行的模拟器?模拟器在设置下是否有暗模式作为开发者选项? 这种使用启动参数设置暗模式的方法对我不起作用 - Xcode 11.3.1 在 iOS 13.3 模拟器上测试。【参考方案2】:

我也对这个问题感兴趣,因为我正在使用 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

    (...)    

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

【讨论】:

如果您使用的是 fastlane,更简单的方法是在配置中使用内置的暗模式标志。在此处搜索 dark_mode:docs.fastlane.tools/actions/capture_ios_screenshots @TheJeff 虽然 fastlane 更容易,但据我所知,没有办法让一个屏幕截图使用暗模式。如果您想要“支持暗模式”屏幕截图,Peter 的解决方案效果更好,因为它可以针对一个测试用例进行配置。它似乎也比依赖于没有记录且似乎经常变化的模拟器参数要脆弱得多 知道了,是的,问题在于为所有内容设置它,而不是为一个屏幕设置它,但是我同意你的观点,这似乎是在一个屏幕上轻松执行此操作的唯一方法。

以上是关于如何在 swift UITests 中的 XCUIApplication 中设置暗模式?的主要内容,如果未能解决你的问题,请参考以下文章

使目标名称 Swift 标志在 UITests 模块中可见(Swift 5)

Swift 3 更新后 iOS UITests 无法执行基本操作

如何在 Xcode 中的 UITests 下等待,直到可以看到某些视图以供点击?

如何在 XCUI 测试自动化框架中组织和分组测试用例

XCUI 测试:如何单击运行时填充的标签

UITests-如何在 UITests 中获取当前语言