Appium — это кроссплатформенный инструмент для тестирования автоматизации мобильных устройств, с помощью которого можно легко создавать автоматизированные тестовые сценарии для платформ iOS и Android. Он может имитировать различные операции внутри приложения, такие как щелчок, скольжение, ввод текста и т. д., если мы вручную выполняем действия, которые может выполнить Appium. Ранее мы узнали о Selenium, инструменте автоматизированного тестирования в Интернете. Appium фактически наследует Selenium, а Appium также использует WebDriver для реализации автоматического тестирования приложений. Для устройств iOS Appium использует UIAutomation для реализации драйвера. Для Android он использует UiAutomator и Selendroid для реализации драйвера.
Appium эквивалентен серверу, мы можем отправить некоторые инструкции по работе в Appium, и Appium будет управлять мобильным устройством в соответствии с другими инструкциями для выполнения различных действий.
Что касается сканеров, мы используем Selenium для сканирования страниц, отображаемых с помощью JavaScript, которые можно сканировать, когда они видны. Appium также доступен, и это хороший выбор для использования Appium в качестве сканера приложений.
Давайте посмотрим на основное использование Appium.
1. Цель этого раздела
Мы используем WeChat на платформе Android в качестве примера, чтобы продемонстрировать, как Appium запускает и управляет приложениями. Основная цель — понять процесс использования Appium для автоматического тестирования и использования связанных API.
2. Подготовка
Убедитесь, что на ПК установлены Appium, среда разработки Android и Python-версия Appium API. Кроме того, на мобильном телефоне Android установлено приложение WeChat.
3. Запустите приложение
Appium может запустить приложение двумя способами: один — использовать встроенный драйвер Appium для открытия приложения, а другой — использовать для этого программу Python. Ниже мы опишем их отдельно.
Сначала откройте Appium, запустите интерфейс, как показано ниже.
Просто нажмите кнопку «Запустить сервер», чтобы запустить службу Appium, что эквивалентно открытию сервера Appium. Мы можем отправить ряд рабочих инструкций на сервер Appium через встроенный драйвер Appium или код Python, и Appium будет управлять мобильным устройством в соответствии с различными инструкциями для выполнения различных действий. После запуска рабочий интерфейс показан на следующем рисунке.
Appium прослушивает порт 4723 после запуска. Мы можем отправить команды операции на сервисный интерфейс, соответствующий этому порту, и на этой странице будет отображаться журнал операций этого процесса.
Подключите телефон Android к ПК с запущенным Appium через кабель для передачи данных и включите функцию отладки USB, чтобы убедиться, что ПК можно подключить к телефону.
Вы можете проверить соединение, введя команду adb следующим образом:
adb devices -l
Если появится результат, аналогичный следующему, это означает, что ПК был правильно подключен к мобильному телефону.
List of devices attached
2da42ac0 device usb:336592896X product:leo model:MI_NOTE_Pro device:leo
model
это имя устройства, которое понадобится позжеdeviceName
Переменная. Я использую топовую версию Mi Note, поэтому имя здесь MI_NOTE_Pro.
Если подсказку не удается найтиadb
проверьте, правильно ли настроены среда разработки Android и переменные среды. Если его можно успешно вызватьadb
команда, но не отображает информацию об устройстве, проверьте соединение телефона и ПК.
Затем откройте приложение со встроенным драйвером Appium и нажмите кнопку «Начать новую сессию» в Appium, как показано на следующем рисунке.
Появится страница конфигурации, как показано ниже.
Необходимо настроить параметры желаемых возможностей при запуске приложения, ониplatformName
,deviceName
,appPackage
,appActivity
.
platformName
: Это название платформы, которое нужно отличать от Android или iOS.Введите здесь Android.deviceName
: это имя устройства, здесь указан конкретный тип телефона.appPackage
: это имя пакета приложения.appActivity
: это название действия записи, которое обычно должно начинаться с .
Также в левом нижнем углу текущей страницы конфигурации есть описания параметров конфигурации, ссылка https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md .
Мы добавляем вышеуказанные 4 конфигурации в Appium, как показано на следующем рисунке.
Нажмите кнопку Сохранить, чтобы сохранить его, и мы сможем продолжать использовать эту конфигурацию в будущем.
Нажмите кнопку «Начать сеанс» в правом нижнем углу, чтобы запустить приложение WeChat на телефоне Android и перейти на стартовую страницу. В то же время на ПК появится окно отладки, из которого мы можем просмотреть текущую страницу мобильного телефона и просмотреть исходный код страницы, как показано на следующем рисунке.
Щелкните элемент экрана в левой колонке, например кнопку входа, и он будет выделен. В это время в среднем столбце отображается исходный код, соответствующий текущей выбранной кнопке, а в правом столбце отображается основная информация об элементе, такая как идентификатор элемента, класс, текст и т. д., а также операции, которые можно выполнять. , такие как Tap, Send Keys, Clear, как показано ниже.
Нажмите третью кнопку записи в верхней части среднего столбца, Appium начнет записывать действие операции.В это время поведение работы с приложением в окне будет записано, и код соответствующего языка может быть сгенерирован автоматически. у Регистратора. Например, мы нажимаем кнопку записи, затем выбираем кнопку входа в приложение и нажимаем операцию Tap, которая имитирует функцию нажатия кнопки.В это время и мобильный телефон, и оконное приложение перейдут на страницу входа, и код, соответствующий этому действию, будет отображаться в средней колонке, как показано ниже.
Затем выберите текстовое поле номера мобильного телефона слева, нажмите «Отправить ключи», и появится диалоговое окно. Введите номер телефона и нажмите «Отправить ключи», чтобы завершить ввод текста, как показано на рисунке ниже.
Мы можем нажимать различные кнопки действий на этой странице, чтобы управлять приложением, и часть Recorder также может генерировать соответствующий код Python.
Давайте посмотрим, как использовать код Python для управления приложением. В первую очередь нужно указать в коде Appium Server, а этот Сервер был включен при открытии Appium, и он работает на порту 4723. Конфигурация следующая:
server = 'http://localhost:4723/wd/hub'
Используйте словарь для настройки параметра Desired Capabilities, код выглядит следующим образом:
desired_caps = {
'platformName': 'Android',
'deviceName': 'MI_NOTE_Pro',
'appPackage': 'com.tencent.mm',
'appActivity': '.ui.LauncherUI'
}
Создайте новую сессию, которая аналогична нажатию кнопки «Начать сессию» встроенного драйвера Appium.Реализация кода выглядит следующим образом:
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Remote(server, desired_caps)
После завершения настройки вы можете запустить приложение WeChat. Но сейчас можно только запустить приложение, но еще ничего не сделано.
Затем используйте код для имитации двух только что продемонстрированных действий: одно — нажать кнопку «Войти», а другое — ввести номер мобильного телефона.
Взгляните на код Python, сгенерированный Recorder для записи на встроенный накопитель Appium.Автоматически сгенерированный код очень громоздкий.Например, код для нажатия кнопки "Войти" выглядит следующим образом:
el1 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.View/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.Button[1]")
el1.click()
Путь селектора XPath этого кода слишком длинный, метод выбора не такой уж научный, а ожидание не установлено при получении элемента, и может быть исключение тайм-аута. Итак, давайте изменим его, чтобы найти элементы по идентификатору и установить задержку ожидания Код для двух операций переписывается следующим образом:
wait = WebDriverWait(driver, 30)
login = wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/cjk')))
login.click()
phone = wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/h2')))
phone.set_text('18888888888')
В итоге полный код выглядит так:
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
server = 'http://localhost:4723/wd/hub'
desired_caps = {
'platformName': 'Android',
'deviceName': 'MI_NOTE_Pro',
'appPackage': 'com.tencent.mm',
'appActivity': '.ui.LauncherUI'
}
driver = webdriver.Remote(server, desired_caps)
wait = WebDriverWait(driver, 30)
login = wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/cjk')))
login.click()
phone = wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/h2')))
phone.set_text('18888888888')
Обязательно повторно подключите мобильный телефон, а затем запустите этот код, после чего вы увидите, что на мобильном телефоне сначала появляется страница приветствия WeChat, а затем сымитируйте нажатие кнопки входа, введите номер мобильного телефона, и операция будет завершена. . Таким образом, мы успешно реализовали работу приложения с использованием кода Python.
4. API
Далее давайте посмотрим, как использовать код для работы с приложением, и подведем итоги использования связанных API. Используемая здесь библиотека Python — AppiumPythonClient, а ее адрес GitHub — https://github.com/appium/python-client, Эта библиотека наследуется от Selenium и имеет много общего с Selenium.
1. Инициализировать
Параметр «Желаемые возможности» необходимо настроить. Полные инструкции по настройке см. на странице https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md. Вообще говоря, достаточно настроить несколько основных параметров, а именно:
from appium import webdriver
server = 'http://localhost:4723/wd/hub'
desired_caps = {
'platformName': 'Android',
'deviceName': 'MI_NOTE_Pro',
'appPackage': 'com.tencent.mm',
'appActivity': '.ui.LauncherUI'
}
driver = webdriver.Remote(server, desired_caps)
Желаемые возможности для запуска приложения WeChat настраиваются здесь, так что Appnium автоматически найдет имя пакета и класс входа на телефоне, а затем запустит его. Имя пакета и имя класса входа можно получить из файла AndroidManifest.xml в пакете установки.
Если открываемое приложение не было установлено на мобильном телефоне заранее, мы можем напрямую указать параметр приложения в качестве пути к установочному пакету, чтобы приложение автоматически устанавливалось и запускалось на мобильном телефоне при запуске программы. , как показано ниже:
from appium import webdriver
server = 'http://localhost:4723/wd/hub'
desired_caps = {
'platformName': 'Android',
'deviceName': 'MI_NOTE_Pro',
'app': './weixin.apk'
}
driver = webdriver.Remote(server, desired_caps)
При запуске программа будет искать установочный пакет APK в текущем пути ПК, после чего установит его в телефон и запустит.
2. Найдите элементы
Мы можем использовать общий метод поиска в Selenium для поиска элементов следующим образом:
el = driver.find_element_by_id('com.tencent.mm:id/cjk')
В Selenium применимы и другие методы поиска элементов, поэтому я не буду их здесь повторять.
На платформе Android мы также можем использовать UIAutomator для выбора элементов следующим образом:
el = self.driver.find_element_by_android_uiautomator('new UiSelector().description("Animation")')
els = self.driver.find_elements_by_android_uiautomator('new UiSelector().clickable(true)')
На платформе iOS мы можем использовать UIAutomation для выбора элементов следующим образом:
el = self.driver.find_element_by_ios_uiautomation('.elements()[0]')
els = self.driver.find_elements_by_ios_uiautomation('.elements()')
Вы также можете использовать предикаты iOS для выбора элементов следующим образом:
el = self.driver.find_element_by_ios_predicate('wdName == "Buttons"')
els = self.driver.find_elements_by_ios_predicate('wdValue == "SearchBar" AND isWDDivisible == 1')
Выбор также можно сделать с помощью цепочки классов iOS следующим образом:
el = self.driver.find_element_by_ios_class_chain('XCUIElementTypeWindow/XCUIElementTypeButton[3]')
els = self.driver.find_elements_by_ios_class_chain('XCUIElementTypeWindow/XCUIElementTypeButton')
Но этот метод применим только к драйверу XCUITest, см. https://github.com/appium/appium-xcuitest-driver.
3. Нажмите
Нажмите, чтобы использоватьtap()
метод, который может имитировать щелчок пальцем (до пяти пальцев) и может устанавливать продолжительность (миллисекунды), код выглядит следующим образом:
tap(self, positions, duration=None)
Последние два параметра следующие.
positions
: это список местоположений, на которые нажали.duration
: это продолжительность клика.
Примеры следующие:
driver.tap([(100, 20), (100, 60), (100, 100)], 500)
Это имитирует нажатие на определенные точки на экране.
Для такого элемента, как кнопка, мы можем напрямую вызвать метод cilck() для имитации щелчка. Пример выглядит следующим образом:
button = find_element_by_id('com.tencent.mm:id/btn')
button.click()
4. Перетаскивание экрана
можно использоватьscroll()
Метод имитирует прокрутку экрана и используется следующим образом:
scroll(self, origin_el, destination_el)
можно реализовать из элементаorigin_el
прокрутить до элементаdestination_el
.
Его последние два параметра следующие.
original_el
: Это управляемый элемент.destination_el
: Это целевой элемент.
Примеры следующие:
driver.scroll(el1,el2)
можно использоватьswipe()
Для имитации скольжения из точки А в точку Б используется следующее:
swipe(self, start_x, start_y, end_x, end_y, duration=None)
Ниже описаны следующие параметры.
start_x
: это абсцисса начального положения.start_y
: это ордината начальной позиции.end_x
: это абсцисса конечного положения.end_y
: Это ордината конечного положения.duration
: это продолжительность в миллисекундах.
Примеры следующие:
driver.swipe(100, 100, 100, 400, 5000)
Таким образом, скольжение от (100, 100) к (100, 400) может быть достигнуто за 5 с.
можно использоватьflick()
Метод имитирует быстрое пролистывание из точки А в точку Б, и его использование выглядит следующим образом:
flick(self, start_x, start_y, end_x, end_y)
Несколько параметров описаны ниже.
start_x
: это абсцисса начального положения.start_y
: это ордината начальной позиции.end_x
: это абсцисса конечного положения.end_y
: Это ордината конечного положения.
Примеры следующие:
driver.flick(100, 100, 100, 400)
5. Перетащите
можно использоватьdrag_and_drop()
Чтобы перетащить элемент на другой целевой элемент, используется следующее:
drag_and_drop(self, origin_el, destination_el)
элементы могут быть реализованыorigin_el
перетащите на элементdestination_el
.
Эти два параметра описаны ниже.
original_el
: Это перетаскиваемый элемент.destination_el
: Это целевой элемент.
Примеры следующие:
driver.drag_and_drop(el1, el2)
6. Ввод текста
можно использоватьset_text()
метод реализует ввод текста следующим образом:
el = find_element_by_id('com.tencent.mm:id/cjk')
el.set_text('Hello')
7. Цепочка действий
Подобно ActionChains в Selenium, TouchAction в Appium поддерживает следующие методы:tap()
,press()
,long_press()
,release()
,move_to()
,wait()
,cancel()
д., пример выглядит так:
el = self.driver.find_element_by_accessibility_id('Animation')
action = TouchAction(self.driver)
action.tap(el).perform()
Сначала выберите элемент, а затем используйте TouchAction для выполнения операции щелчка.
Если вы хотите реализовать операцию перетаскивания, вы можете использовать следующие методы:
els = self.driver.find_elements_by_class_name('listView')
a1 = TouchAction()
a1.press(els[0]).move_to(x=10, y=0).move_to(x=10, y=-75).move_to(x=10, y=-600).release()
a2 = TouchAction()
a2.press(els[1]).move_to(x=10, y=10).move_to(x=10, y=-300).move_to(x=10, y=-600).release()
Используя вышеуказанный API, мы можем выполнить большинство операций. Дополнительные сведения об операциях API см. по адресу: https://testerhome.com/topics/3711.
V. Заключение
В этом разделе мы в основном понимаем базовое использование операционных приложений Appium и использование общих API.
Этот ресурс был впервые опубликован в личном блоге Цуй Цинцай Цзин Ми:Практическое руководство по разработке веб-краулера на Python3 | Цзин Ми
Если вы хотите узнать больше информации о поисковых роботах, обратите внимание на мой личный публичный аккаунт WeChat: Coder of Attack.
WeChat.QQ.com/Day/5 Это радость VE Z…(автоматическое распознавание QR-кода)