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

ct3nt3jp  于 2023-09-30  发布在  Swift
关注(0)|答案(4)|浏览(115)

我想知道是否有一种方法可以在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 Development Docs上进行广泛搜索。
  • StackOverflow只展示了如何在Xcode中的scheme中硬编码,或者如何通过杀死模拟器,擦除它,并破解plist值来从外部破解模拟器。

感谢您的任何帮助!

dauxcl2d

dauxcl2d1#

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

    (...)    
}

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

w8f9ii69

w8f9ii692#

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

defaults read NSGlobalDomain AppleInterfaceStyle

它的React是
黑暗
在您的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开始更新

现在可以在模拟器中切换外观。这是测试Map和其他黑暗模式功能的好方法。

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

模拟器支持切换iOS模拟器(13.0及更高版本)的外观。从应用程序中选择Debug > Toggle Appearance。在命令行中使用simctl ui子命令,例如设置暗外观

xcrun simctl ui <device> appearance dark
9gm1akwq

9gm1akwq3#

这是我的方法,目前正在Patrol testing framework中使用。只有当设备的语言设置为英语时才有效(我只测试了美国地区)。

#if targetEnvironment(simulator)
  self.preferences.descendants(matching: .any)["Developer"].firstMatch.tap()
  
  let value = self.preferences.descendants(matching: .any)["Dark Appearance"].firstMatch.value! as! String
  if value == "0" {
    self.preferences.descendants(matching: .any)["Dark Appearance"].firstMatch.tap()
  }
#else
  self.preferences.descendants(matching: .any)["Display & Brightness"].firstMatch.tap()
  self.preferences.descendants(matching: .any)["Dark"].firstMatch.tap()
#endif
a0x5cqrl

a0x5cqrl4#

截至iOS 15+

if #available(iOS 15.0, *) {
    XCUIDevice.shared.appearance = .dark
}
  • 你可以来回切换任意次数 *

不要忘记恢复颜色:

override func tearDownWithError() throws {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    if #available(iOS 15.0, *) {
        XCUIDevice.shared.appearance = .light
    }
}

相关问题