Давайте сначала рассмотрим несколько терминов и пояснений:
Базовые знания об элементах управления такие же, как и у selenium. Appium абстрагирует модель управления для мобильного терминала, называемую структурой dom; он понимает все элементы управления как файлы xml. В файле xml каждый элемент управления имеет свой собственный тип и атрибуты.
Теперь, когда у нас есть типы и атрибуты, мы можем естественным образом находить элементы на их основе. А поскольку вся модель представляет собой XML, мы также можем использовать XPath для поиска информации о каждом элементе управления. Звучит знакомо? Мы также представили соответствующие методы позиционирования элементов во время веб-автоматизации. Для получения подробной информации вы можете просмотреть первую статью в конце статьи и нажать, чтобы просмотреть.
В результате анализа домашней страницы приложения Snowball с помощью uiautomatorviewer были получены следующие результаты:
Анализируя результаты, мы видим, что атрибуты и типы элементов:
IOS и Android немного отличаются с точки зрения свойств управления (сначала приводится краткое описание, позже будет опубликована отдельная статья об IOS, пожалуйста, обратите внимание):
Appium поддерживает подмножество стратегий таргетинга WebDriver:
2.21. Поиск по «классу» (например, типу компонента пользовательского интерфейса) — обычно не рекомендуется.
Так проведение определяет тип управления Нахождением.,Например, TextView, ImageView и т. д.
В реальной работе этот метод позиционирования используется редко, поскольку на странице может быть много TextView, ImageView и т. д.;
appiumdriver.findElementByClassName("android.widget.TextView");
Как упоминалось выше, xpath может не только позиционировать элементы на мобильном терминале, но также является одним из наиболее часто используемых методов позиционирования. Для веб-автоматизации мы сначала рекомендуем позиционирование CSS, а для позиционирования мобильного терминала мы сначала рекомендуем. xpath позиционирование. Хорошо. Синтаксис позиционирования xpath обеспечит нам точность и удобство позиционирования, а влияние на скорость будет полностью в пределах нашего приемлемого диапазона.
В следующей структуре dom в интерфейсе имеется несколько элементов управления одного типа. Эти элементы управления имеют одинаковый идентификатор или атрибуты и не являются уникальными. Поэтому в настоящее время операция позиционирования указанного элемента управления не может быть выполнена напрямую. пришло время xpath показать свои таланты.
Например, если мы хотим разместить второй RelativeLayout, следующий за «Нарисовать замкнутый круг», конкретный метод записи будет следующим:
//Могут быть реализованы следующие два метода записи
By.xpath("((//*[@text='Нарисуйте замкнутый круг'])[2]/following-sibling::android.widget.RelativeLayout)[2]")
By.xpath("(//*[@text='Нарисуйте замкнутый круг'])[2]/following-sibling::*[@class='android.widget.RelativeLayout'])[2] ")
Многие элементы управления имеют текстовые атрибуты, но Appium не поддерживает прямое позиционирование текста. В реальной работе мы часто используем текст для позиционирования. Это связано с xpath. Инкапсулируя синтаксис xpath, мы можем настроить метод для позиционирования элементов на основе текста:
public By ByText(String text){
return By.xpath("//*[@text='"+ text + "']");
}
appiumdriver.findElement(ByText("сосредоточиться на"));
Кроме того, когда необходимо найти всплывающее окно Toast, это можно сделать только через xpath:
Иногда после выполнения операции появляется сообщение с сообщением. Например, после нажатия определенной кнопки или нажатия кнопки вниз для обновления может появиться сообщение, похожее на «Обновление выполнено успешно», а затем исчезнуть через несколько секунд;
Всплывающее сообщение, скорее всего, будет Toast, который поставляется вместе с системой Android. Когда Toast всплывает, узел android.widget.Toast появится в текущем интерфейсе и исчезнет по мере исчезновения сообщения, если нам нужно найти его; всплывающее сообщение в это время, найдите его. Для тестирования вы можете использовать метод позиционирования xpath.
System.out.println( appiumdriver.findElementByXPath("//*[@class='android.widget.Toast']").getText());
результат:
Дополнительную информацию о xpath можно найти в блоге:
Распахиваем двери веб-автоматизации для достижения «криминального феномена» — обнаружения селеновой архитектуры, установки среды и общих методов позиционирования элементов.
или W3C:
https://www.w3school.com.cn/xpath/xpath_syntax.asp
Студенты, изучавшие веб-автоматизацию, знают, что элементы в HTML имеют свои собственные идентификаторы. На мобильной стороне элементы по-прежнему имеют свои собственные значения идентификаторов, но имя — идентификатор ресурса, например:
Примечание. Мы видим, что значение id очень длинное. Фактически для фактического использования вам нужно взять только часть после косой черты /, как показано ниже:
By.id("statusTitle")
В мобильной автоматизации существует специальный метод позиционирования, основанный на позиционировании accessibilityId, который представлен в dom значением атрибута content-desc. Если в Android значение записано в content-desc, его можно позиционировать через. это:
Здесь неловко. . . Поскольку R&D часто лень писать, после долгих поисков я не смог найти пример, надеюсь, все знают, как им пользоваться~.
Еще следует отметить: если вы хотите записать это в форме «By.xxx», вам нужно использовать MobileBy.
MobileBy.AccessibilityId("AccessibilityId");
appiumdriver.findElementByAccessibilityId("AccessibilityId");
Иногда нам нужно выполнить определенные операции в интерфейсе, чтобы найти нужные элементы, например переместить список для поиска и т. д. В настоящее время мы можем использовать Android uiautomator.
Здесь мы используем демонстрацию API в симуляторе для демонстрации, вводим «Просмотры» в APIDemo, а затем сдвигаем экран, чтобы найти «Всплывающее меню» и щелкнуть по нему.
Вы можете использовать UIAutomator Android для выполнения операций скольжения. В этом случае вам необходимо использовать AndroidDriver. Кроме того, вы можете использовать UiScrollable для позиционирования элементов:
В uiautomator UiSelector на официальном сайте есть примеры, написанные на Ruby, но метод позиционирования тот же, и его можно напрямую использовать в качестве ссылки в Java-коде.
driver.findElementByXPath("//*[@text='Views']").click();
((AndroidDriver<MobileElement>)driver).
findElementByAndroidUIAutomator
("new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text(\"Popup Menu\").instance(0))")
.click();
В реальной работе AndroidUIAutomator иногда не может позиционировать, и может быть небольшое отклонение в положении элемента позиционирования. Вот небольшая модификация, позволяющая избежать таких случайных сбоев.
By departmentName = MobileBy.AndroidUIAutomator(
"new UiScrollable(new UiSelector().scrollable(true).instance(0))." +
"scrollIntoView(new UiSelector().text(\""+ departName +"\").instance(0))");
find(departmentName);
// click(departmentName); Исходный результат непосредственного управления элементом скольжения
click(ByText(departName));//Теперь используйте XPath для повторного подтверждения перед работой, вероятность успеха значительно повышается
Демонстрация эффекта бега:
В предыдущей статье мы представили различные движки, используемые в Appium. Вы можете просмотреть первую статью в конце статьи, чтобы просмотреть ее.
Давайте кратко взглянем на картинку ниже:
Последняя версия, которую мы используем, теперь сначала поддерживает uiautomator2. Если вы используете относительно более раннюю версию, вы можете поддерживать uiautomator. Итак, какое влияние эти два движка оказывают на позиционирование, представленное выше? Давайте посмотрим на исходный код:
Последняя версия, которую мы используем, теперь сначала поддерживает uiautomator2. Если вы используете относительно более раннюю версию, вы можете поддерживать uiautomator. Итак, какое влияние эти два движка оказывают на позиционирование, представленное выше? Давайте посмотрим на исходный код:
Если взять в качестве примера позиционирование идентификатора, то из исходного кода Uiautomator видно, что его позиционирование идентификатора шире. Когда мы используем By.id, он будет соответствовать идентификатору ресурса, идентификатору доступности и идентификатору одновременно.
В Uiautomator2 расположение идентификаторов подразделяется, и перед работой оцениваются разные идентификаторы. Поэтому при использовании Uiautomator2 наш метод записи должен быть более строгим.
Официальная документация appium:
http://appium.io/docs/en/writing-running-appium/finding-elements/
http://appium.io/docs/en/commands/element/find-elements/
Путь исходного кода Uiautomator2: