Использование appium и uiautomater для навигации по иерархии макетов

У меня есть список с несколькими элементами списка. Каждый элемент представляет собой относительный макет с кнопкой изображения и вложенным линейным макетом с текстовым представлением с уникальным текстом. Мне нужно иметь возможность найти элемент в списке на основе текста в текстовом представлении, а затем нажать кнопку изображения рядом с ним. На основе API UiAutomator кажется, что лучший способ сделать это — использовать метод fromParent, который позволяет вам получить доступ к родственным элементам родительского представления. У меня нет проблем с прокруткой и поиском текстового представления, но мне не удалось создать UiSelector для его родительского представления или кнопки изображения.

self.web_driver.find_element_by_android_uiautomator('new UiScrollable(
new UiSelector().resourceId("' + self.id_prefix + 'list_view")).scrollIntoView(
new UiSelector().text("' + identifier + '")) ;')

self.web_driver.find_element_by_android_uiautomator('new UiSelector().fromParent(
new UiSelector().text("' + identifier + '"))')

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

UiSelector API, метод fromParent

Трассировка стека

Traceback (most recent call last):
  File "/.../test_suites/data_management.py", line 46, in test_delete
    self.delete(valid)
  File "/.../android_data_management.py", line 45, in delete
    'list_view"))')
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/appium/webdriver/webdriver.py", line 110, in find_element_by_android_uiautomator
    return self.find_element(by=By.ANDROID_UIAUTOMATOR, value=uia_string)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 712, in find_element
    {'using': by, 'value': value})['value']
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 201, in execute
    self.error_handler.check_response(response)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/appium/webdriver/errorhandler.py", line 29, in check_response
    raise wde
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/appium/webdriver/errorhandler.py", line 24, in check_response
    super(MobileErrorHandler, self).check_response(response)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: An element could not be located on the page using the given search parameters.

Копия макета xml. Красный — текстовое представление, которое я использую для поиска элемента списка. Синий — элемент списка, зеленый — кнопка с изображением, которую я хочу нажать


person Anthony Porter    schedule 02.07.2016    source источник


Ответы (1)


Я столкнулся с этой проблемой, и мое решение не использует сценарий автоматизации пользовательского интерфейса, хотя попробуйте, если оно работает для вас.

  1. Создайте POJO для данных внутри относительного макета.
  2. Получите элемент представления списка.
  3. Получить каждый относительный элемент представления внутри представления списка
  4. Инициализируйте и назначьте элемент/текст объекту POJO и добавьте объект в HashSet/Hashmap.
  5. Определите желаемый относительный макет на основе текста.
  6. получить элемент ImageButton из объекта и нажать на него.
person pr4bh4sh    schedule 05.07.2016