Необходимо определить xpath для элемента android с помощью appium
Я тестирую свое приложение для Android с помощью Appium framework. У меня есть экран android, который не имеет идентификаторов для своих представлений (и я не хочу добавлять...), поэтому я думал использовать Xpath.
вот как выглядит экран в UI Automator Viewer:
Я хочу получить все относительные макеты (отмечены красным цветом - шестнадцать элементов)
я попробовал следующий:
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
был бы признателен за любую помощь.
5 ответов
прямо сейчас есть пара неприятных ошибок с XPath на android, которые объясняют поведение, которое вы видите. Они должны быть исправлены в 1.3.1 релиз
- вы не можете искать по корневым узлам.. ссылке
- к сожалению, это означает, что подробный xpath, вероятно, xpath(каламбур) успеха
- вы иногда получаете 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();
следующий код работал для меня:
WebElement webElement = driver.findElementByXPath("//android.widget.ListView[1]/android.widget.LinearLayout[1]");
вежливость: не удалось найти элемент с помощью xpath в Appium