2016-08-09 52 views
1

Ich habe einige UI-Tests in Xcode 7 geschrieben und wenn ich auf eine Schaltfläche verweisen muss, verwende ich seine accessibility.identifier. Diese Logik funktionierte für alle Sprachen korrekt.UI Automatisierungstest mit mehrsprachiger iOS

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

Mit Xcode 7.3, wenn ich versuche, diesen Code starten Sie den Test schlägt fehl, da die Taste nicht gefunden werden kann, wenn die Simulator Sprache Englisch nicht. Ich habe auch versucht, die Navigation aufzuzeichnen, um zu überprüfen, wie Xcode diese Schaltfläche liest, wenn die Sprache anders ist als Englisch, und ich habe herausgefunden, dass sie die Übersetzungen als Schlüssel verwendet ... das macht überhaupt keinen Sinn!

Diese Tests waren wirklich nützlich, um Screenshots zu erstellen ... aber offensichtlich mit diesem Problem kann ich keine Tests ausführen (und Bildschirme erstellen) für alle Sprachen.

Wie kann ich absolut auf eine Schaltfläche zeigen, wenn sie nicht durch Bezeichner erkannt wird !?

---- EDIT

fand ich das Hauptproblem. Das Unternehmen, das die Übersetzung tat hat die labelidentifier Felder übersetzt:/

Ich versuche, das Element zu erhalten mit app.buttons.elementBoundByIndex(1) aber es scheint nicht richtig

Antwort

0

arbeiten Sie tatsächlich accessibilityIdentifier zu Taste zugeordnet haben und dann versuche es zuzugreifen. Der Zugriff auf Schaltflächen mit Text ist immer eine schlechte Idee, da sich der Text jederzeit ändern kann. Zum Beispiel : XCUIApplication(). Buttons ["AppSignInIdentifier"]

0

Ich hoffe, dass Ihr Projekt die Lokalisierungsdatei verwaltet. Ich stand vor demselben Problem. Wenn ja, dann funktioniert die Lokalisierung noch nicht direkt mit UIAutomation. Es gibt eine Problemumgehung dafür, ich teile das Code-Snippet mit Ihnen. Sie müssen zunächst die xcodeproj-Datei in Ihrem Bundle herausfinden. Da diese Dateien nicht im UIAutomation-Ziel gebündelt sind.

- (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; 
} 

Und dies zu nutzen //

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

Und außerdem für die bessere Nutzung der Automation, stellen Sie bitte die Zugänglichkeit Etiketten für Ihre Kontrollen, so dass es einfach sein würde für den Automatisierungsprozess zu finden Das ist weniger Aufwand für den Prozessor und weniger anfällig für Abstürze und Probleme.

0

Eingabehilfenbezeichnungen sollten keine lokalisierten Zeichenfolgen sein, da sie sich sonst ändern, wenn Sie Ihre App in einer anderen Sprache ausführen.

Einfach die Zugriffsbezeichner fest codieren, um sie ungeachtet der Sprache persistent zu machen.

button.accessibilityIdentifier = "myButton"