2013-07-16 15 views
12

Próbuję zidentyfikować macierzysty widok elementu interfejsu użytkownika, aby móc swobodnie poruszać się po interfejsie użytkownika.Jak mogę uzyskać nadrzędny widok za pomocą uiautomator?

Na przykład w aplikacji Ustawienia, mogę znaleźć widok z tekstem „Bluetooth”:

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

Teraz część, gdzie utkniesz jest to jedno: chcę, aby poruszać się na dwóch poziomach i Rozpocznij nowe wyszukiwanie przycisku włączania/wyłączania, który włącza i wyłącza bluetooth.

Uwaga: Mogę uzyskać przycisk, jeśli użyję poniższego kodu.

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

Poszukuje przycisków przełącznika i zwraca drugie spotkanie. Chcę, aby wyszukiwanie było bardziej precyzyjne i poszukaj przycisku w układzie liniowym, który zawiera tekst "Bluetooth".

UPDATE: Jest to układ z aplikacji Settings (część Bluetooth że muszę):

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

Odpowiedz

14

Musisz najpierw znaleźć dwa poziomy UiObject, używając tekstu. Można to zrobić za pomocą metod getChildByText() w UiCollection lub UiScrollable. Wtedy możesz łatwo znaleźć przełącznik. W przypadku "Ustawień" ten kod działa na moim urządzeniu:

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

Ta metoda również nie działa. UiObject dwa poziomy w górę to LinearLayout, ale nie ma atrybutu tekstowego. Nie mogę go zidentyfikować po tekście "Bluetooth". Zaktualizował pytanie z faktycznym układem aplikacji. –

+1

To działa. Nie identyfikujesz się przez tekst LinearLayout. "Wyszukuje każde dziecko pasujące do argumentu childPattern, który ma element podrzędny UI w dowolnym miejscu w swojej podrzędnej hierarchii, który ma atrybut tekstowy równy tekstowi." Innymi słowy, szukasz LinearLayout, który ma dziecko z tekstem Bluetooth. – Anders

+0

Tak, to działa. Wygląda na to, że zrobiłem coś złego za pierwszym razem. –

0

Jeśli chcesz po prostu szukać suwak ON/OFF -> można bezpośrednio sprawdzić bluetooth Przycisk OFF/ON i kliknij go, aby wyłączyć/włączyć bluetooth -

Możesz sprawdzić zrzut ekranu strony bluetooth (używając polecenia - uiautomatorviewer) w wierszu poleceń i zobaczyć, że przycisk OFF będzie miał tekst w suwaku OFF/ON. Następnie po prostu użyj -

+1

mogę zidentyfikować przycisk za pomocą swojej klasie Nazwa. Właśnie wybieram drugą instancję tego obiektu Ui. Chciałem wyszukać element interfejsu użytkownika w elemencie nadrzędnym elementu, który można zidentyfikować w 100%, bez względu na to, jaki jest mój układ w jednym punkcie. Tak więc wciąż pozostaje pytanie: w jaki sposób mogę zidentyfikować rodzica ui elemen? –

3

Poniższy kod działa dla mnie.

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

dzięki za zapętlenie poprzez układ liniowy soultion! to działało dobrze dla mnie! –

0

niedawno okazało się, że mogliśmy korzystać getFromParent (dla UiObject) i fromParent (dla UiSelector), aby wybrać wujka obiektu na przykład. Jeśli mamy taki układ:

`LinearLayout 
    relative layout 
     text View 
    relative layout 
     check box` 

mogliśmy dostać wyboru z TextView z tym kodem:

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

gdzie TextViewTitle jest Uiobject z widoku tekstu

+0

nie, które nie działają – 13bit

+0

, ale możemy użyć UiObject2 z BySelector – 13bit

Powiązane problemy