2015-04-03 46 views
3
PopupWindow$PopupViewContainer(@xxxxxxxx) 
--ListPopupWindow$DropDownListView(@yyyyyyyy) 
    --RelativeLayout(@zzzzzzz) 
    ImageView 
    TextView 
    --RelativeLayout(@aaaaaaaa) 
    ImageView 
    TextView 
    --RelativeLayout(@aaaaaaaa) 
    ImageView 
    TextView 

我想知道如何使用Android的咖啡自動化訪問TextView的在RelativeLayout的2,作爲@id不存在和值動態分配。下拉值選擇用咖啡與Android動態元素的ID

以上是下拉列表,我想單擊第二個選項。

例如,當我們在任何搜索框中搜索項目時,我們會得到填充列表。我想點擊列表中的第二個。所有的元素ID都是動態的。

回答

3

您也許能夠只是做

onData(anything()) 
    .atPosition(1) 
    .perform(click()); 

然而,假定只有一個適配器視圖。如果你有其他人,你需要以某種方式挑出那個ListPopupWindow$DropDownListView

我知道你說過所有的ID都是動態的,但是有一些祖先視圖可以通過ID挑選出來嗎?如果是這樣,你可以不喜歡

onData(anything()) 
    .inAdapterView(isDescendantOfA(withId(someAncestorId))) 
    .atPosition(1) 
    .perform(click()); 

作爲最後的手段,我們可以匹配類的名稱,但它是一個有點脆弱:

onData(anything()) 
    .inAdapterView(withClassName(equalTo(
     "android.widget.ListPopupWindow$DropDownListView"))) 
    .atPosition(1) 
    .perform(click()); 
+1

是每個ID在彈出的動態,當我看到樹視圖(在Android Studio中),用於這個彈出它不是在MainSearchActivity顯示,但其在樹視圖PopupWindow不同的行動:@xxxxxxxx。現在,當我嘗試上面的代碼時,它拋出錯誤「android.support.test.espresso.NoMatchingViewException」,因爲PopupWindow不在主要活動中,它不是指彈出窗口中的佈局,而是從MainSearchActivity引用。我想在執行上面的代碼時將焦點設置爲popupwindow,它應該引用popupwindow佈局而不是MainActivityWindow。 – StackTrace 2015-04-07 01:13:54

+0

對此的任何解決方案?我遇到了多個紡紗者的問題。 – JPM 2017-08-08 22:30:13

+0

@JPM你應該使用'inAdapterView',但是你傳遞哪個匹配器取決於你的視圖層次結構。你的匹配者有不同的ID嗎?通過'withId'。不同的初始選擇?通過'SpinnerText'傳遞給它。不同的父容器(具有不同的ID)?傳遞它isDescendantOfA'。 – 2017-08-09 18:30:22

0

我這個問題,我掙扎發現您需要使用withText的組合來選擇視圖和名爲RootMatchers.isPlatformPopup()的選項,該選項將嘗試查找視圖中的匹配文本,如自動完成視圖,並且它實際上是爲此目的而設計的。

它應該看起來像這樣;

onView(withText("matching text")) 
.inRoot(RootMatchers.isPlatformPopup()) 
.perform(click());