2013-07-16 14 views
12

私はUIを自由にナビゲートできるように、UI要素の親ビューを識別しようとしています。uiautomatorを使用してビューの親を取得するにはどうすればよいですか?

例えば、設定アプリで、私は「ブルートゥース」をテキストとの見解を見つけることができますが:

UiObject btView = new UiObject(new UiSelector().text("Bluetooth")); 

は今、私は動けなくなる部分はこの1つである:私は、最大2つのレベルをナビゲートしたいとブルートゥースを有効または無効にするオン/オフボタンの新しい検索を開始します。

注:以下のコードを使用するとボタンが表示されます。

UiObject btButtonView = new UiObject(new UiSelector().className("android.widget.Switch").instance(1)); 

これは、スイッチボタンを検索し、2番目の出会いを返します。検索をより正確にして、 "Bluetooth"テキストを含む線形レイアウトのボタンを探してください。

UPDATE: これは、設定アプリ(私は必要なBluetoothの部分)のレイアウトです:

LinearLayout 
    LinearLayout 
     ImageView 
    RelativeLayout 
     TextView (with text = "Bluetooth") 
    Switch() 

答えて

14

まず、テキストを使用して2つのレベルのUiObjectを見つける必要があります。これは、UiCollectionまたはUiScrollableのgetChildByText()メソッドを使用して行うことができます。次に、スイッチを簡単に見つけることができます。 [設定]の場合、このコードは自分の端末で使用できます。

UiScrollable settingsList = new UiScrollable(new UiSelector().scrollable(true)); 
UiObject btItem = settingsList.getChildByText(new UiSelector().className(LinearLayout.class.getName()),"Bluetooth", true); 

UiObject btSwitch = btItem.getChild(new UiSelector().className(android.widget.Switch.class.getName())); 
btSwitch.click(); 
+1

この方法も機能しません。 2つ上のレベルのUiObjectはLinearLayoutですが、text属性はありません。だから私はテキスト "Bluetooth"でそれを識別することはできません。質問をアプリケーションの実際のレイアウトに更新しました。 –

+1

それは動作します。 LinearLayoutのテキストでは識別できません。 msgstr "子のUI要素を子階層に持つchildPattern引数に一致する子が、text属性と同じテキストを持つサブ階層内にあるかどうかを調べます。"言い換えれば、テキストBluetoothを持つ子を持つLinearLayoutを探します。 – Anders

+0

はい、動作します。私は初めて何かが間違っているようだ。 –

0

あなただけのON/OFFスライダーを検索したい場合は - >あなたが直接、ブルートゥースを検索することができますOFF/ONボタンをクリックしてブルートゥースを無効/有効にするには -

コマンドプロンプトで(コマンド-uiautomatorviewerを使用して)ブルートゥースページのスクリーンショットを確認し、OFFボタンにOFF/ONスライダのテキストが表示されることを確認します。次に使用する -

new UiObject(new UiSelector().text("OFF")).click(); 
+1

とTextViewTitleがUIObjectです

TextViewTitle().getFromParent(new UiSelector() .fromParent(new UiSelector() .resourceId("android:id/checkbox"))); 

を、私はそのクラスを使用して、ボタンを識別することができます名。私はそのuiオブジェクトの2番目のインスタンスを選択するだけです。私は、私のレイアウトが一点であっても、100%識別できる要素の親ビューでui要素を検索したかったのです。 質問はまだあります。私はどのようにしてユー・エレメンの親を特定できますか? –

3

以下のコードは私のために機能します。

//Getting the scrollable view 

UiScrollable settingsList = new UiScrollable(new UiSelector().scrollable(true)); 

for (int i=0; i<=settingsList.getChildCount(new UiSelector().className(LinearLayout.class.getName())); i++) { 
//Looping through each linear layout view 
UiObject linearLayout = settingsList.getChild(new UiSelector().className(LinearLayout.class.getName()).instance(i)); 

//Checking if linear layout have the text. If yes, get the switch, click and break out of the loop. 
if (linearLayout.getChild(new UiSelector().text("Bluetooth")).exists()) { 
    UiObject btSwitch = linearLayout.getChild(new UiSelector().className(android.widget.Switch.class.getName())); 
    btSwitch.click(); 
    break; 
    } 
} 
+0

リニアレイアウトソルーションによるループありがとう!それは私のためにうまくいった! –

0

は最近、私たちは、たとえば、オブジェクトの叔父を選択するためにgetFromParent(UIObjectクラス用)及び(UiSelector用)fromParentを使用できることを見出しました。 私たちは、このようなレイアウトがある場合:私たちは、このコードでのTextViewからチェックボックスを得ることができる

`LinearLayout 
    relative layout 
     text View 
    relative layout 
     check box` 

を:テキストビュー

+0

いいえ、それは動作しません – 13bit

+0

しかし私たちはBySelectorでUiObject2を使うことができました – 13bit

関連する問題