2017-05-30 5 views
1

次のコードを使用しているときにUIテストで複数のボタンが見つかったとの問題があります。Xcode UIが複数のボタンをテストする

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

だから、私はユニットテストをreran、右のその行を実行する前にブレークポイントを設定し、録音ボタンを押すと、ボタンをクリックし、それが次のコードを生成しました。

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

もちろん、テストの先頭にはlet app = XCUIApplication()があります。

なぜこれが起こっているのでしょうか?

時々p UIApplication.shared.windowsをデバッガで実行すると、配列に2つの値があります。なぜ私は複数のウィンドウを持っていないか分かりません。私がウィンドウで持っている唯一のやりとりは、UIApplication.shared.keyWindow?.rootViewControllerを別のビューコントローラに設定することです。didFinishLaunchingWithOptionsに次のコードがあります。 if文の中とelse文の中にある

 // 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() 

は私ではなく、それはSecondViewのだFirstViewのを除いてほとんど同じコードを持っています。

+0

'app.buttons [" Upgrade "]。debugDescription'は、ヒントを提供するかもしれません。 –

+1

私はこの問題が発生する前に思っています。テストしているボタンに一意のアクセシビリティ識別子を投げて、テストを再録音してみてください。 – Adrian

+0

@PauloMattos私はブレークポイントを設定し、それを印刷しようとしましたが、多くのものを印刷しました。私はすぐにそれを見て、何も役に立たない、あるいは私が知らなかったことを見つけることができません。 –

答えて

2

このメッセージは、accessibilityIdentifierと、画面上に複数のボタンがあるので、表示されますaccessibilityLabelまたはvalue、「アップグレード」、それをタップするかをうまくすることはできません。

録音されたバージョンを使用するときに機能する理由は、録音ツールがタイプ.otherのインデックス1の要素内で検索を絞り込む必要があることを識別したため、対話するために「アップグレード」ボタンをクリックします。

これはあなたのウィンドウには問題ありませんが、ボタンの識別子の一意性とテストでの扱い方を教えてください。

ボタンが問題のアプリのページで1回のみ使用される状況では、をUIButtonに設定することをお勧めします。その値はアプリのそのページ内で一意である必要があります。そのため、他の場所で同じ文字列を使用していないことを確認してください。そして、あなたは明確ボタンにアクセスすることができます。画面上の同じアップグレード]ボタンの複数のインスタンスが、ボタンが画面上の繰り返しパターンの一部であり、例えば、同じ時間(時がある状況では

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

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

を、のような販売用の製品)がたくさんある場合は、それらそれぞれが同じaccessibilityIdentifierを持っているため、それはOKですが、あなたは指定されたインデックスでアイテムにアクセスするためにelement(boundBy:)を使用して、あなたのテストの要素にアクセスする方法を変更する必要があります

// 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() 

この状況では、正しいコンテナビューを見つける方法をとることもできます。その中のアップグレードボタンを探します。

// 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

それは本当に全く意味をなさない。現在のビューコントローラでは、 'Upgrade'という値のボタンが1つしかないと確信しています。私はまた、これがiPhone 4Sでのみ発生することを理解しました。 –

0

私は一つだけがあるはず際XCUIElementQueryは、複数の結果を返しているXCodeの8.3にアップデートしたので、同様の問題を見ています。このビルドにはバグが導入されている可能性があります。

https://forums.developer.apple.com/thread/75546

はバグを記述し、レーダーはここにある:私は element(boundBy:)を使用して、その後 XCUIElementQueryとして、目的のオブジェクトを返すように私のクエリを強要しようとしているが掲示する回避策を試してみたし、それがために働い https://openradar.appspot.com/31498932

私。

UIテストがどのように不安定になっているのでしょうか。

0

私は同じ問題に直面し、そこから抜け出すために複数のことを試みました。最終的に、Xcodeを8.3.3に、シミュレータをiOS 10.3にアップデートしたときに問題が発生したことがわかりました。 私のシミュレータをiOS 10.2に切り替えたところ、完全に機能しました。

関連する問題