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

UITests-How to get current language in UITests

XCUIApplication *app = [[XCUIApplication alloc] init]; 
[app.buttons[@"login"] tap];

如上所示,在 tests.m 文件中,我想通过字符串 "login" 获取登录按钮,但是,我的应用程序支持多国语言。如何获取我的应用程序的当前语言。

下面的方法是我获取当前语言的方法。用户在我的应用程序的设置视图中设置语言。我将当前语言存储在 NSUserDefaults 中。

+ (NSString*)currentLanguage 
{
    NSUserDefaults *lanUser = [NSUserDefaults standardUserDefaults];
    NSString *currentLanguage = [lanUser valueForKey:kCNOGASingularLanguage];
    if([currentLanguage length]==0)
        currentLanguage = kApplicationLanguageEnglish;
    return currentLanguage;
}

将用户的语言存储在您应用的 UserDefaults 中,然后从您的 UI 测试中访问它是行不通的。您的应用和 UITest 运行 作为单独的进程,这意味着您的 UITest 无法访问您应用的 UserDefaults

有一个简单的解决方案:要独立于用户语言,您可以在 UIButton 上设置 accessibilityIdentifier,然后通过 accessibilityIdentifier:[=27 访问按钮=]

在您的应用中:

button.accessibilityIdentifier = @"login";

在你的UI测试中:

[app.buttons[@"login"] tap];

从不显示 accessibilityIdentifier,VoiceOver 也不会读取它,因此不必对其进行本地化。只需确保您使用的是 accessibilityIdentifier 而不是 而不是 accessibilityLabel。因为 accessibilityLabel 将由 VoiceOver 供残障用户阅读,因此应进行本地化。

备选方案

如果您不能使用 accessibilityIdentifier 来查询您的 UI 元素,您可以在 UI 测试中使用应用的 LocalizableStrings 文件来获取本地化的按钮标题(在这种情况):

首先将您的 Localizable.strings 文件添加到您的 UI 测试目标,然后通过 UI 测试包访问该文件以获取本地化字符串(我使用了一些辅助方法那个):

func localized(_ key: String) -> String {
    let uiTestBundle = Bundle(for: AClassFromYourUITests.self)
    return NSLocalizedString(key, bundle: uiTestBundle, comment: "")
}

前段时间我写了一些关于此的 blog post 内容,其中包含更多详细信息。