Автоматизированное тестирование приложений | Структура DOM и методы позиционирования элементов
Автоматизированное тестирование приложений | Структура DOM и методы позиционирования элементов

Давайте сначала рассмотрим несколько терминов и пояснений:

  • dom: Объектная модель документа Объектная модель документа
  • Приложение DOM: впервые использовалось при взаимодействии html и js. Структурированное описание интерфейса. Распространенные форматы: html и xml. Основными элементами являются узлы и атрибуты.
  • xpath: язык путей xml, используемый для позиционирования узлов в xml. XPath может перемещаться по элементам и атрибутам в документах xml. Давайте посмотрим на DOM приложения следующим образом:

Базовые знания об элементах управления такие же, как и у selenium. Appium абстрагирует модель управления для мобильного терминала, называемую структурой dom; он понимает все элементы управления как файлы xml. В файле xml каждый элемент управления имеет свой собственный тип и атрибуты.

Теперь, когда у нас есть типы и атрибуты, мы можем естественным образом находить элементы на их основе. А поскольку вся модель представляет собой XML, мы также можем использовать XPath для поиска информации о каждом элементе управления. Звучит знакомо? Мы также представили соответствующие методы позиционирования элементов во время веб-автоматизации. Для получения подробной информации вы можете просмотреть первую статью в конце статьи и нажать, чтобы просмотреть.

  • позиция
  • взаимодействие
  • утверждение

В результате анализа домашней страницы приложения Snowball с помощью uiautomatorviewer были получены следующие результаты:

Анализируя результаты, мы видим, что атрибуты и типы элементов:

  • node
  • attribute
  • clickable
  • content-desc
  • resource-id
  • text
  • bounds

IOS и Android немного отличаются с точки зрения свойств управления (сначала приводится краткое описание, позже будет опубликована отдельная статья об IOS, пожалуйста, обратите внимание):

  • Атрибуты DOM аналогичны структурам узлов.
  • Имена и атрибуты называются по-разному

Appium поддерживает подмножество стратегий таргетинга WebDriver:

2.21. Поиск по «классу» (например, типу компонента пользовательского интерфейса) — обычно не рекомендуется.

Язык кода:txt
копировать
Так проведение определяет тип управления Нахождением.,Например, TextView, ImageView и т. д.

В реальной работе этот метод позиционирования используется редко, поскольку на странице может быть много TextView, ImageView и т. д.;

Язык кода:txt
копировать
appiumdriver.findElementByClassName("android.widget.TextView");

Как упоминалось выше, xpath может не только позиционировать элементы на мобильном терминале, но также является одним из наиболее часто используемых методов позиционирования. Для веб-автоматизации мы сначала рекомендуем позиционирование CSS, а для позиционирования мобильного терминала мы сначала рекомендуем. xpath позиционирование. Хорошо. Синтаксис позиционирования xpath обеспечит нам точность и удобство позиционирования, а влияние на скорость будет полностью в пределах нашего приемлемого диапазона.

В следующей структуре dom в интерфейсе имеется несколько элементов управления одного типа. Эти элементы управления имеют одинаковый идентификатор или атрибуты и не являются уникальными. Поэтому в настоящее время операция позиционирования указанного элемента управления не может быть выполнена напрямую. пришло время xpath показать свои таланты.

Например, если мы хотим разместить второй RelativeLayout, следующий за «Нарисовать замкнутый круг», конкретный метод записи будет следующим:

Язык кода:txt
копировать
//Могут быть реализованы следующие два метода записи
By.xpath("((//*[@text='Нарисуйте замкнутый круг'])[2]/following-sibling::android.widget.RelativeLayout)[2]")
By.xpath("(//*[@text='Нарисуйте замкнутый круг'])[2]/following-sibling::*[@class='android.widget.RelativeLayout'])[2] ")

Многие элементы управления имеют текстовые атрибуты, но Appium не поддерживает прямое позиционирование текста. В реальной работе мы часто используем текст для позиционирования. Это связано с xpath. Инкапсулируя синтаксис xpath, мы можем настроить метод для позиционирования элементов на основе текста:

Язык кода:txt
копировать
public By ByText(String text){
        return By.xpath("//*[@text='"+ text + "']");
    }

appiumdriver.findElement(ByText("сосредоточиться на"));

Кроме того, когда необходимо найти всплывающее окно Toast, это можно сделать только через xpath:

Иногда после выполнения операции появляется сообщение с сообщением. Например, после нажатия определенной кнопки или нажатия кнопки вниз для обновления может появиться сообщение, похожее на «Обновление выполнено успешно», а затем исчезнуть через несколько секунд;

Всплывающее сообщение, скорее всего, будет Toast, который поставляется вместе с системой Android. Когда Toast всплывает, узел android.widget.Toast появится в текущем интерфейсе и исчезнет по мере исчезновения сообщения, если нам нужно найти его; всплывающее сообщение в это время, найдите его. Для тестирования вы можете использовать метод позиционирования xpath.

Язык кода:txt
копировать
System.out.println( appiumdriver.findElementByXPath("//*[@class='android.widget.Toast']").getText());

результат:

Дополнительную информацию о xpath можно найти в блоге:

Распахиваем двери веб-автоматизации для достижения «криминального феномена» — обнаружения селеновой архитектуры, установки среды и общих методов позиционирования элементов.

или W3C:

https://www.w3school.com.cn/xpath/xpath_syntax.asp

Студенты, изучавшие веб-автоматизацию, знают, что элементы в HTML имеют свои собственные идентификаторы. На мобильной стороне элементы по-прежнему имеют свои собственные значения идентификаторов, но имя — идентификатор ресурса, например:

Примечание. Мы видим, что значение id очень длинное. Фактически для фактического использования вам нужно взять только часть после косой черты /, как показано ниже:

Язык кода:txt
копировать
By.id("statusTitle")

В мобильной автоматизации существует специальный метод позиционирования, основанный на позиционировании accessibilityId, который представлен в dom значением атрибута content-desc. Если в Android значение записано в content-desc, его можно позиционировать через. это:

Здесь неловко. . . Поскольку R&D часто лень писать, после долгих поисков я не смог найти пример, надеюсь, все знают, как им пользоваться~.

Еще следует отметить: если вы хотите записать это в форме «By.xxx», вам нужно использовать MobileBy.

Язык кода:txt
копировать
MobileBy.AccessibilityId("AccessibilityId");
appiumdriver.findElementByAccessibilityId("AccessibilityId");

Иногда нам нужно выполнить определенные операции в интерфейсе, чтобы найти нужные элементы, например переместить список для поиска и т. д. В настоящее время мы можем использовать Android uiautomator.

Здесь мы используем демонстрацию API в симуляторе для демонстрации, вводим «Просмотры» в APIDemo, а затем сдвигаем экран, чтобы найти «Всплывающее меню» и щелкнуть по нему.

Вы можете использовать UIAutomator Android для выполнения операций скольжения. В этом случае вам необходимо использовать AndroidDriver. Кроме того, вы можете использовать UiScrollable для позиционирования элементов:

В uiautomator UiSelector на официальном сайте есть примеры, написанные на Ruby, но метод позиционирования тот же, и его можно напрямую использовать в качестве ссылки в Java-коде.

Язык кода:txt
копировать
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 иногда не может позиционировать, и может быть небольшое отклонение в положении элемента позиционирования. Вот небольшая модификация, позволяющая избежать таких случайных сбоев.

Язык кода:txt
копировать
    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

Если взять в качестве примера позиционирование идентификатора, то из исходного кода Uiautomator видно, что его позиционирование идентификатора шире. Когда мы используем By.id, он будет соответствовать идентификатору ресурса, идентификатору доступности и идентификатору одновременно.

  • Исходный код Uiautomator2

В Uiautomator2 расположение идентификаторов подразделяется, и перед работой оцениваются разные идентификаторы. Поэтому при использовании Uiautomator2 наш метод записи должен быть более строгим.

Официальная документация appium:

http://appium.io/docs/en/writing-running-appium/finding-elements/

http://appium.io/docs/en/commands/element/find-elements/

Путь исходного кода Uiautomator2:

https://github.com/appium/appium-uiautomator2-server/blob/master/app/src/main/java/io/appium/uiautomator2/handler/FindElement.java

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose