Необходимо определить xpath для элемента android с помощью appium

Я тестирую свое приложение для Android с помощью Appium framework. У меня есть экран android, который не имеет идентификаторов для своих представлений (и я не хочу добавлять...), поэтому я думал использовать Xpath.

вот как выглядит экран в UI Automator Viewer: enter image description here

Я хочу получить все относительные макеты (отмечены красным цветом - шестнадцать элементов)

я попробовал следующий:

 List<WebElement> webElementslist =
 mAppDriver.findElementsByXPath("//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.ViewAnimator[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ScrollView[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[2]");

но я не получил никаких предметов.

I поиск в интернете и нашел следующие учебники xpath, попробовал больше вариантов, но снова без успеха.

http://www.zvon.org/comp/r/tut-XPath_1.html#intro

http://www.w3.org/TR/xpath/

был бы признателен за любую помощь.

5 ответов


прямо сейчас есть пара неприятных ошибок с XPath на android, которые объясняют поведение, которое вы видите. Они должны быть исправлены в 1.3.1 релиз

  1. вы не можете искать по корневым узлам.. ссылке
    • к сожалению, это означает, что подробный xpath, вероятно, xpath(каламбур) успеха
  2. вы иногда получаете 240 элемента, когда у вас есть только 16 ссылке

в идеале вы можете искать идентификатор ресурса android.widget.LinearLayout родитель всех 16 RelativeLayoutС, а затем сделать что-то вроде:

//android.widget.LinearLayout[@resource-id="foo"]/android.widget.RelativeLayout

ваше подробное решение не сработало, потому что вы дали одному из макетов позицию [2].

вот он, исправлено:

//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.ViewAnimator[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ScrollView[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.RelativeLayout

.... пожалуйста, пожалуйста, используйте первое решение.

Я ищу решение для вашей проблемы с помощью UiAutomator локатор стратегия, но пока нет ответов (потому что .fromChild() и .fromParent() кажется, сломан)


имея в виду тот факт, что //foo[1] возвращает все Foo узлы, которые являются первыми дочерними элементами их родителя (а не первым дочерним узлом foo) попробуйте что-то вроде этого:

//ScrollView/LinearLayout/LinearLayout[2]/LinearLayout/RelativeLayout

не тестируется, но он должен дать вам все RelativeLayouts, которые являются дочерним элементом LinearLayout, который является дочерним элементом LinearLayout, который является вторым дочерним элементом LinearLayout, который является дочерним элементом ScrollView.


просто попробуйте это u может легко получить доступ

driver.findElement(By.xpath("//*[@class='android.widget.FrameLayout' and @bounds='[418,564][780,885]']")).click();

Screenshot of UI


следующий код работал для меня:

WebElement webElement = driver.findElementByXPath("//android.widget.ListView[1]/android.widget.LinearLayout[1]");

вежливость: не удалось найти элемент с помощью xpath в Appium


Работает Отлично

By.xpath ("//[@id= 'id1'] / following-sibling:: [@id= 'id2']"));