2013-07-16 5 views
12

Я пытаюсь определить родительский вид элемента ui, чтобы свободно перемещаться по пользовательскому интерфейсу.Как получить родительский элемент представления с помощью uiautomator?

Например, в настройках приложения, я могу найти представление с текстом «Bluetooth»:

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

Теперь та часть, где я застрял этот один: я хочу, чтобы перейти на два уровня вверх и начните новый поиск кнопки включения/выключения, которая включает и отключает Bluetooth.

Примечание: я могу получить кнопку, если я воспользуюсь приведенным ниже кодом.

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

Выполняет поиск кнопок переключателя и возвращает вторую встречу. Я хочу, чтобы поиск был более точным, и найдите кнопку в линейной компоновке, которая содержит текст «Bluetooth».

UPDATE: Это расположение настройки приложения (часть Bluetooth, что мне нужно):

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

ответ

14

Сначала вы должны найти UiObject два уровня вверх, используя текст. Это можно сделать с помощью методов getChildByText() в UiCollection или UiScrollable. Тогда вы можете легко найти переключатель. Для «Настройки» этот код работает на моем устройстве:

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

Этот метод также не работает. Два уровня UiObject - это LinearLayout, но он не имеет текстового атрибута. Поэтому я не могу идентифицировать его по тексту «Bluetooth». Обновлен вопрос с фактическим расположением приложения. –

+1

Это действительно работает. Вы не идентифицируете текст LinearLayout. «Он ищет любого дочернего элемента, соответствующего аргументу childPattern, который имеет дочерний элемент пользовательского интерфейса в любом месте своей иерархии, который имеет текстовый атрибут, равный тексту». Другими словами, вы ищете LinearLayout, у которого есть ребенок с текстом Bluetooth. – Anders

+0

Да, это работает. Кажется, я сделал что-то неправильно в первый раз. –

0

Если вы хотите просто найти слайдера ON/OFF -> Вы можете непосредственно искать блютуз OFF/ON и нажмите на нее, чтобы отключить/включить bluetooth.

Вы можете проверить снимок экрана страницы bluetooth (с помощью команды - uiautomatorviewer) в командной строке и увидеть, что кнопка OFF будет иметь текст в слайдере OFF/ON. Затем просто используйте -

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

можно идентифицировать кнопки, используя свой класс имя. Я просто выбираю второй экземпляр этого объекта ui. Я хотел найти элемент ui в родительском представлении элемента, который может быть идентифицирован на 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

спасибо за Looping через линейную компоновку soultion! это сработало для меня! –

0

недавно обнаружили, что мы могли бы использовать getFromParent (для UIObject) и fromParent (для UiSelector), чтобы выбрать дядя объекта, например. Если у нас есть такой макет:

`LinearLayout 
    relative layout 
     text View 
    relative layout 
     check box` 

мы могли бы получить флажок из TextView с этим кодом:

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

где TextViewTitle является UIObject с видом текста

+0

nope, что doen't работает – 13bit

+0

, но мы могли бы использовать UiObject2 с BySelector – 13bit

Смежные вопросы