Как получить список дочерних элементов элемента в Appium?

Я работаю с собственным приложением iOS через Appium.

У меня есть следующая структура:

UIAApplication ->
                  UIAWindow ->
                              UIATextBox
                              UIALabel
                  UIAWindow ->
                              SomethingElse

Я нашел способ получить первый UIAWindow, и я хотел бы получить список всех элементов в этом окне. Как я могу это сделать?

Я хотел бы получить UIATextBox и UIAAbel из первого элемента UIAWindow, но НЕ SomethingElse.

Как вообще составить список дочерних элементов?

  @Test
  public void testListWindows() {
      List<MobileElement> windows = driver.findElementsByClassName("UIAWindow");
      List<MobileElement> elements = windows.get(0).?????
  }

person Artem    schedule 13.12.2015    source источник
comment
Пожалуйста, поделитесь более подробной информацией. Когда вам нужен список всех элементов в окне, то есть ли необходимость сбора с использованием какого-либо конкретного тега?   -  person Asit Tripathy    schedule 14.12.2015
comment
Мне нужны все дочерние элементы всех типов для конкретного элемента, такого как UIAWindow, независимо от типа элемента.   -  person Artem    schedule 14.12.2015
comment
Хорошо, можете ли вы поделиться XML-файлом экстракта Appium на той же странице, которую вы хотите собрать в качестве «элементов» списка. Добавьте точку останова в свой код, когда он переходит на определенную страницу, и делитесь XML-кодом Appium.   -  person Asit Tripathy    schedule 14.12.2015
comment
@AsitTripathy, Appium — это мобильная платформа, а не веб-страница.   -  person Artem    schedule 14.12.2015
comment
Я думал, вы работаете с Appium с Native App.   -  person Asit Tripathy    schedule 14.12.2015
comment
Пожалуйста, поделитесь более подробной информацией, так как в вашем вопросе не упоминается его веб-страница или какое-либо родное или гибридное приложение в IOS. Спасибо   -  person Asit Tripathy    schedule 14.12.2015
comment
Я добавил больше деталей, как вы просили.   -  person Artem    schedule 14.12.2015
comment
можете ли вы попробовать этот List‹MobileElement› elements = windows.get(0).findElements(By.xpath(*));   -  person Akhil K    schedule 14.12.2015
comment
Пробовал, не получилось :(   -  person Artem    schedule 15.12.2015


Ответы (2)


Ты почти там. У вас есть список всех окон UIAWindow, тогда как вам нужен список всех элементов первого окна UIAWindow. Я бы предложил использовать Xpath с подстановочным знаком.

Это даст вам каждый элемент, который является прямым потомком первого UIAWindow:

List<MobileElement> elements = driver.findElements(MobileBy.xpath("//UIAWindow[1]/*");

И это даст вам каждый дочерний элемент, дочерний элемент, вспомогательный дочерний элемент и т. д. первого UIAWindow:

List<MobileElement> elements = driver.findElements(MobileBy.xpath("//UIAWindow[1]//*");

Дополнительный совет: если вы автоматизируете для iOS, я предполагаю, что у вас есть доступ к OS X, где вы можете установить приложение Appium dot и использовать инспектор. Инспектор — отличный инструмент для проверки запросов xpath перед их добавлением в код.

person econoMichael    schedule 14.12.2015
comment
Вы говорите, что List‹MobileElement› elements = windows.get(0).findElements(MobileBy.xpath(./*)); никогда не будет работать? Что делать, если мне нужны окна в других местах? Я закончу с дублированием? - person Artem; 15.12.2015
comment
Большое спасибо. работаю над этим кодом)) у меня к вам очень важный вопрос. если у меня нет исходного кода приложения, когда я тестирую его с помощью appium в java. если в какой-то момент приложение вылетает, могу ли я с этим справиться? или мне нужен исходный код, чтобы увидеть имя исключения? пример: я нажимаю кнопку, она выдает исключение nullpointerexception, но я не могу справиться с этим в appium java, как это сделать? - person Rashad Nasirli; 04.02.2021

Вы также можете найти текстовое поле и метку по его классу для приложения iOS в Appium. Метод findElementsByClassName вернет все элементы на текущем экране, соответствующие этому классу.

List<MobileElement> textFields = driver.findElementsByClassName("UIATextField");
MobileElement textField = textFields.get(0);

List<MobileElement> labels = driver.findElementsByClassName("UIAStaticText");
MobileElement label = labels.get(0);
person iOS Developer    schedule 10.08.2016