Как я могу получить родительский вид с помощью uiautomator?

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

Например, в приложении "Настройки" я могу найти представление с текстом "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 ()

Ответ 1

Сначала вам нужно найти 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();

Ответ 2

Ниже код работает для меня.

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

Ответ 3

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

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

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

Ответ 4

Недавно

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

`LinearLayout
    relative layout
        text View
    relative layout
        check box`

мы могли бы получить checkbox из textview с помощью этого кода:

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

где TextViewTitle - это Uiobject с текстовым представлением