Как я могу получить родительский вид с помощью 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 с текстовым представлением