2017-05-30 4 views
1

Ich habe ein Problem, bei dem mein UI-Test mehrere Schaltflächen anzeigt, wenn der folgende Code verwendet wird.Xcode UI-Tests Mehrere gefundene Schaltflächen

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

So reran ich mein Gerät zu testen und einen Haltepunkt rechts setzen, bevor diese Zeile und drücken Sie die Aufnahmetaste und klickte auf den Button und es erzeugt den folgenden Code ausgeführt wird.

app.children(matching: .window).element(boundBy: 0).children(matching: .other).element(boundBy: 1).buttons["Upgrade"].tap() 

Natürlich an der Spitze des Tests habe ich let app = XCUIApplication().

Irgendeine Idee, warum das passieren würde?

Manchmal beim Ausführen p UIApplication.shared.windows im Debugger hat es 2 Werte im Array. Ich bin mir nicht sicher warum, da ich nie mehrere Fenster habe. Die einzige Interaktionen, die ich mit Windows habe, ist die Einstellung UIApplication.shared.keyWindow?.rootViewController auf verschiedene View-Controller manchmal, und der folgende Code in didFinishLaunchingWithOptions.

 // Get view controllers ready 
     self.window = UIWindow(frame: UIScreen.main.bounds) 
     let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
     let mainViewController: ViewController = mainStoryboard.instantiateViewController(withIdentifier: "FirstView") as! ViewController 
     // Show view controller 
     self.window?.rootViewController = mainViewController 
     self.window?.makeKeyAndVisible() 

, die innerhalb einer if-Anweisung ist und in der anderen Aussage habe ich so ziemlich den gleichen Code außer statt FirstView es ist SecondView.

+0

Drucken 'app.buttons [" Upgrade "]. DebugDescription' könnte einen Hinweis geben ... –

+1

Ich denke, dass ich dieses Problem schon einmal begegnet bin. Sie könnten versuchen, eine eindeutige Zugänglichkeits-ID auf die Schaltfläche zu werfen, die Sie testen, und den Test erneut aufzeichnen. – Adrian

+0

@PauloMattos Ich habe einen Haltepunkt gesetzt und versucht, das zu drucken, aber es hat eine Menge Zeug gedruckt. Ich habe es mir schnell angeschaut und kann nichts Nützliches finden oder das wusste ich noch nicht. –

Antwort

2

Diese Meldung erscheint, weil es mehr als eine Taste auf dem Bildschirm mit den accessibilityIdentifier ist, accessibilityLabelodervalue, „Upgrade“, so kann es, was man tippen nicht funktioniert.

Der Grund, dass es funktioniert, wenn Sie die aufgezeichnete Version verwenden, da die Aufnahme-Tool, dass die Suche innerhalb des Elements vom Typ ist begrenzbar suchen muss .other bei Index 1, um deren identifiziert hat "sicher sein Upgrade "-Schaltfläche zur Interaktion mit.

Es ist kein Problem mit Ihren Fenstern, aber mit der Einzigartigkeit der Kennungen Ihrer Schaltflächen und wie Sie sie in Ihrem Test behandeln.

In einer Situation, in der Sie nur einmal auf der Seite Ihrer App in Frage verwendet wird, ist es am besten ein einzigartiges accessibilityIdentifier auf den UIButton einzustellen. Der Wert sollte innerhalb dieser Seite Ihrer App eindeutig sein. Stellen Sie daher sicher, dass Sie die gleiche Zeichenfolge nirgendwo anders verwenden. Dann können Sie die Taste eindeutig zugreifen:

// app code 
let upgradeButton: UIButton! 
upgradeButton.accessibilityIdentifier = "upgradeButton" 

// test code 
let app = XCUIApplication() 
let upgradeButton = app.buttons["upgradeButton"] 
upgradeButton.tap() 

In der Situation, wo es mehrere Instanzen der gleichen Upgrade Taste auf dem Bildschirm zur gleichen Zeit (zB wenn der Knopf Teil eines wiederholten Musters auf dem Bildschirm ist, wie wenn es viele Produkte zum Verkauf) sind, dann ist es in Ordnung für sie jeweils die gleiche accessibilityIdentifier haben, aber Sie sollten die Art und Weise Sie das Element in Ihrem Test Zugriff ändern, element(boundBy:) mit Elemente zuzugreifen in bestimmten Indizes:

// app code 
let upgradeButton: UIButton! 
upgradeButton.accessibilityIdentifier = "upgradeButton" 

// test code 
let app = XCUIApplication() 
let upgradeButton = app.buttons["upgradeButton"].element(boundBy: 1) // second upgrade button 
upgradeButton.tap() 

In dieser Situation könnten Sie auch den Ansatz verfolgen, die richtige Containeransicht zu finden, und Suche nach dem Upgrade-Button darin.

// test code 
let app = XCUIApplication() 
let upgradeButtonContainer = app.descendants(matching: .any).containing(.button, identifier: "upgradeButton").element(boundBy: 1) // second upgrade button-containing element 
let upgradeButton = upgradeButtonContainer.buttons["upgradeButton"] 
upgradeButton.tap() 
+0

Das macht überhaupt keinen Sinn. Ich bin zuversichtlich, dass ich auf dem aktuellen View-Controller nur 1 Button mit dem Wert 'Upgrade' habe. Ich habe auch herausgefunden, dass dies nur auf dem iPhone 4S passiert. –

0

ich ähnliche Probleme XCode bin zu sehen, da die Aktualisierung 8.3, wo die XCUIElementQuery mehrere Ergebnisse zurückkehrt, wenn es nur eine sein sollte. In diesem Build kann ein Fehler auftreten.

https://forums.developer.apple.com/thread/75546 beschreibt den Fehler und das Radar ist hier: https://openradar.appspot.com/31498932

ich das geschrieben habe versucht, Abhilfe, indem Sie versuchen meine Anfragen zu zwingen, um das gewünschte Objekt als XCUIElementQuery zurückzukehren und dann element(boundBy:) verwenden und es funktionierte für mich.

Es ist ärgerlich, wie instabil die UI-Tests sind.

0

Ich konfrontiert dasselbe Problem und versuchte mehrere Dinge, um daraus zu kommen. Letztendlich fand ich heraus, dass das Problem begann, als ich meinen Xcode auf 8.3.3 und Simulator OS auf iOS 10.3 aktualisierte. Schaltete meinen Simulator zurück auf iOS 10.2 und es funktionierte perfekt.

Verwandte Themen