2017-02-17 2 views
1

最近、私はUIPickerWheel内のすべての値を取得する方法を見つけるために、頭痛が悪かった(と私はまだ苦労しています)。私のためには、ホイールの特定の行に移動するのに十分でなければならないが、私はできない!だからイライラする!私はすべての値(https://stackoverflow.com/a/39300344/821407)を取得する行ごとにスクロールしようとしましたが、それはとても遅いです!どんな手掛かり?UIPickerViewとUIユニットテスト:UIPickerWheelの値を取得するには?

NB:adjustToPickerWheelValueを使用することはできません。私の根本的な問題は、動的なので値が分からず、launchArguments/launchEnvironmentを避けたいからです。

答えて

2

これはおそらくあなたが望んでいた答えではありませんが、UITestのUIPickerViewにあるすべての行のタイトルを取得することはできません。

あなたが知っているように、UITestを実行するときは、アプリのUI要素には、XCUIElementクラスでしかアクセスできません。そのクラスにはvalueというプロパティがあり、アクセスするUI要素に関する情報が表示されます。 UIPickerViewにアクセスすると、valueには現在選択されている行のタイトルが表示されます。しかし、選択された行のみ。ピッカーの行要素にアクセスできますが、残念ながら行要素のvalueプロパティは常に空です。だからここに運がない。取得できるすべての情報は、ピッカーの行数です。

これは本当に驚くことではありません。 UIPickerViewにアクセスしても、すべての行のタイトルに直接アクセスすることはできませんでした。 UIPickerViewは、それが表示するタイトルについて知りません。タイトルを提供するのはUIPickerViewDataSourceの仕事です。

残念ながら、UIPickerViewのすべての行タイトルをUITestで知る必要がある場合は、実際には、アプリのユーザーインターフェイスで各値を1つずつ選択する必要があります。

しかし、あなたがリンクした答えほど複雑である必要はありません。代わりにスクロールをシミュレートするのは、単に(わずかに速いはずです)、それを選択するために、次の行をタップすることができますあなたの質問に

let pickerView = app.pickerWheels.element 
let numRows = pickerView.children(matching: .any).count 
var values: [String] = [pickerView.value as! String] 

for _ in 0..<numRows { 
    pickerView.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.55)).tap() 
    values.append(pickerView.value as! String) 
} 

あなたは本当にあなたがテストしようとしているかを説明していません。しかし、ピッカーが正しい行タイトルを持っているかどうかをテストしたいのであれば、UnitTestはもっと実用的なアプローチでしょうか?

+0

あなたの答えに感謝し、私は本当に感謝しています。 UIPickerViewは検索フォーム上にあり、その上でタップし、ランダムな値を選択して検索を実行してから、いくつかのアサーションを実行する必要があります。問題は、ピッカービューの値が動的なので、私は事前に値を知らないということです。インストゥルメントの古いツールであるオートメーションを使用すると、インデックスごとに特定の行にアクセスできます。とにかく私はあなたの答えを受け入れるでしょう。なぜなら、私がしたことがあるからですが、それはまだ遅いです。彼らが改善し、インデックスで値を調整できることを願っています –

関連する問題