2016-08-09 2 views
1

Xcode 7でいくつかのUIテストを書いています。ボタンを参照する必要があるときは、accessibility.identifierを使用します。このロジックはすべての言語で正しく機能しました。 Xcodeの7.3iOSの多言語によるUIオートメーションテスト

app.buttons["signin"].tap() 

私は、シミュレータの言語が英語でない場合は、ボタンを見つけることができないため、テストが失敗し、このコードを起動してみてください。私はまた、言語が英語で異なるときにXcodeがこのボタンをどのように読み込むかを調べるためのナビゲーションを記録しようとしました。そして、翻訳をキーとして使用することがわかりました...全く意味をなさない!

これらのテストはスクリーンショットを作成するのに本当に便利でした...しかし、明らかにこの問題では、すべての言語のテスト(およびスクリーンの作成)を実行できません。

識別子で認識できない場合、絶対的な方法でボタンをポイントするにはどうすればいいですか?

---- EDIT

私は主な問題を発見しました。翻訳をした会社はlabelidentifierフィールドを翻訳しました:/

私はapp.buttons.elementBoundByIndex(1)を使用して要素を取得しようとしているが、正しく

答えて

0

あなたが実際accessibilityIdentifierがボタンに割り当てることができ、その後、動作するようには思えませんそれにアクセスしてみてください。いつでもテキストが変わる可能性があるので、テキスト付きのボタンにアクセスすることは常に悪い考えです。 など。 :XCUIApplication()。buttons ["AppSignInIdentifier"]

0

あなたのプロジェクトがローカリゼーションファイルを維持していることを願っています。私は同じ問題に直面した。そうであれば、ローカリゼーションはまだUIAutomationで直接動作しません。 これを回避する方法があります。コードスニペットをあなたと共有しています。 バンドル内のxcodeprojファイルを最初に見つけ出す必要があります。これらのファイルはUIAutomationターゲットにバンドルされていないためです。

- (NSString *)getLocalizedString:(NSString *)string withComments:(NSString *)comments { 
    NSString *userLocale = [[NSLocale currentLocale] localeIdentifier]; 
    NSString *userLanguage = [userLocale substringToIndex:2]; 
    NSString *path = [self getProjectPath]; 

    path = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"/YourProjectFileName/Resources/Localization/%@.lproj",userLanguage]]; 

    NSBundle *bundle = [NSBundle bundleWithPath:path]; 
    NSString *localizedString = NSLocalizedStringFromTableInBundle(string, @"Localizable", bundle, comments); 

    return localizedString; 
} 


- (NSString *)getProjectPath { 

    NSString *currentSourceFilePath = [[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] stringByDeletingLastPathComponent]; 

    NSString *currentPath = [currentSourceFilePath copy]; 

    BOOL foundIt = NO; 

    do { 
     NSString *testPath = [currentPath stringByAppendingPathComponent:@"XYZ.xcodeproj"]; 

     if ([[NSFileManager defaultManager] fileExistsAtPath:testPath]) { 
      // found it 
      foundIt = YES; 
      break; 
     } 

     if ([currentPath isEqualToString:@"/"]) { 
      // cannot go further up 
      break; 
     } 

     currentPath = [currentPath stringByDeletingLastPathComponent]; 

    } while ([currentPath length]); 

    if (!foundIt) { 
     return nil; 
    } 

    return currentPath; 
} 

と自動化プロセスを発見するために、それは簡単になるように自動化をより良く使用するために、この//

NSString *loginStr = [self getLocalizedString:@"Login" withComments:@""]; 

しかもを使用するように、あなたのコントロールのためのアクセシビリティラベルを設定してくださいそれはプロセッサのオーバヘッドが少なく、クラッシュや問題を起こしにくいものです。

0

アクセシビリティIDはローカライズされた文字列であってはなりません。そうでない場合は、別の言語でアプリを実行しているときに変更されます。

アクセシビリティ識別子を言語に関係なく永続化するようにハードコードしてください。

button.accessibilityIdentifier = "myButton"