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

Posted

技术标签:

【中文标题】UITests-如何在 UITests 中获取当前语言【英文标题】:UITests-How to get current language in UITests 【发布时间】:2018-12-05 08:18:35 【问题描述】:
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;

【问题讨论】:

您是否正在尝试测试应用是否正确本地化?您是否正在尝试测试功能而不考虑语言? 【参考方案1】:

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

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

在您的应用中:

button.accessibilityIdentifier = @"login";

在您的 UITest 中:

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

accessibilityIdentifier 永远不会显示,VoiceOver 也不会读取它,因此不必对其进行本地化。只要确保您使用的是accessibilityIdentifier accessibilityLabel。因为accessibilityLabel 将被VoiceOver 读取给残障用户,并且应该本地化。

替代

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

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

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

不久前,我写了一点blog post 并提供了更多细节。

【讨论】:

谢谢joern,但是在原始代码中有很多地方应该设置accessibilityIdentifier。有没有其他不用改原码的方法。 如果你真的需要,你可以在你的 UITests 中使用 LocalizableStrings 文件来获得本地化的按钮标题。我会将其添加到答案中。 感谢您的详细解答!但问题是我不使用 Localizable.strings 文件。我只是创建两个 plist 语言文件,然后按如下键获取文本: [CMMultiLanguage stringMultiLanguageWithIdentity:@"key"]; 那么 `accessibilityIdentifier' 是要走的路。

以上是关于UITests-如何在 UITests 中获取当前语言的主要内容,如果未能解决你的问题,请参考以下文章

在 UITests 中获取 UISwitch 状态/值

UITests:如何测试标签是不是在更改后包含一些文本?

如何在 Xamarin UITests 获取列表视图项的计数

如何从 UITests 中访问 UITabBarItem?

UITests(快照)中的本地化字符串始终为英文

如何在 UITests 中选择 UITableView 的一部分?