🔥 Важное для QA-специалистов! 🔥
В QaRocks ты найдешь туториалы, задачи и полезные книги, которых нет в открытом доступе. Уже более 15.000 подписчиков – будь среди нас! Заходи к нам в телеграм канал QaRocks
В этой статье речь пойдет о тестировании iOS-приложений. Разберем, как подготовить окружение для тестирования iOS-приложений — что необходимо установить и как настроить симуляторы. Далее — как запустить приложение в симуляторе и выполнять действия с помощью автотестов.
Содержание:
- Что такое Appium?
- Настройка окружения
- Запуск iOS-приложения в симуляторе
- Поиск локаторов в iOS с помощью Appium Desktop
- Поиск элементов в Appium
- Действия с жестами в Appium
Что такое Appium?
Appium — это фреймворк с открытым исходным кодом для автоматизации тестирования нативных, гибридных и мобильных веб-приложений. Он работает с iOS, Android и Windows с помощью протокола WebDriver . Appium считается стандартом для автоматизации мобильного тестирования.
Настройка окружения
1. Установите Java Development Kit (JDK) версии 7 или выше
3. Установите Appium через терминал (пропустите, если планируете использовать Appium Desktop)
npm install -g appium
4. Установите Appium Desktop (по желанию)
5. Установите Xcode из Mac App Store
Запуск iOS-приложения в симуляторе
Необходимо убедиться, что сервер Appium запущен и работает на порту 4723.
private static IOSDriver < IOSElement > driver; @BeforeClass public void classInit() throws URISyntaxException, MalformedURLException { URL testAppUrl = getClass().getClassLoader().getResource("TestApp.app.zip"); File testAppFile = Paths.get(Objects.requireNonNull(testAppUrl).toURI()).toFile(); String testAppPath = testAppFile.getAbsolutePath(); var desiredCaps = new DesiredCapabilities(); desiredCaps.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone 12 Pro Max"); desiredCaps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS"); desiredCaps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "14.4"); desiredCaps.setCapability(MobileCapabilityType.APP, testAppPath); driver = new IOSDriver < IOSElement > (new URL("http://127.0.0.1:4723/wd/hub"), desiredCaps); driver.closeApp(); } @BeforeMethod public void testInit() { if (driver != null) { driver.launchApp(); } } @AfterMethod public void testCleanup() { if (driver != null) { driver.closeApp(); } }
После создания драйвера закрываем приложение, если оно открыто. Перед каждым тестом приложение запускается заново.
Запуск Appium-сервера из кода
Чтобы не запускать сервер Appium вручную, его можно запустить из кода:
appiumLocalService = new AppiumServiceBuilder().usingAnyFreePort().build(); appiumLocalService.start();
Получение пути к тестовому приложению
APK-файл копируется из папки resources. Вот как достать его путь:
URL testAppUrl = getClass().getClassLoader().getResource("TestApp.app.zip"); File testAppFile = Paths.get(Objects.requireNonNull(testAppUrl).toURI()).toFile(); String testAppPath = testAppFile.getAbsolutePath();
Инициализация настроек Appium
URL testAppUrl = getClass().getClassLoader().getResource("TestApp.app.zip"); File testAppFile = Paths.get(Objects.requireNonNull(testAppUrl).toURI()).toFile(); String testAppPath = testAppFile.getAbsolutePath(); var desiredCaps = new DesiredCapabilities(); desiredCaps.setCapability(MobileCapabilityType.DEVICE_NAME, "iPhone 8"); desiredCaps.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS"); desiredCaps.setCapability(MobileCapabilityType.PLATFORM_VERSION, "14.4"); desiredCaps.setCapability(MobileCapabilityType.APP, testAppPath); driver = new IOSDriver<IOSElement>(new URL("http://127.0.0.1:4723/wd/hub"), desiredCaps);
В качестве имени устройства укажите имя вашего симулятора. Если планируете тестировать нативное или гибридное приложение, обязательно задайте путь к приложению. И, наконец, укажите название и версию платформы.
После корректной инициализации всех необходимых capabilities передайте их в конструктор IOSDriver. Если вы не хотите запускать сервер Appium из кода, есть конструктор для передачи URL.
Поиск локаторов в iOS с помощью Appium Desktop
Appium предлагает удобный инструмент для поиска нужных элементов. С помощью Appium Desktop вы можете найти любой элемент и его локаторы, кликнув по нему на скриншоте или найдя его в дереве исходного кода.
После запуска и начала сессии Appium Desktop можно просматривать элементы в исходнике.

Поиск элементов в Appium
- По ID:
IOSElement textField = driver.findElementById("IntegerA");
- По классу:
IOSElement textField = driver.findElementByClassName("XCUIElementTypeTextField");
- По имени:
IOSElement textField = driver.findElementByName("IntegerA");
- По XPath:
IOSElement button = driver.findElementByXPath("//XCUIElementTypeButton[@name='ComputeSumButton']");
- По IosNsPredicate:
IOSElement button = driver.findElementByIosNsPredicate("type == \"XCUIElementTypeButton\" AND name == \"ComputeSumButton\"");
Поиск элементов с помощью IOSDriver
@Test public void addTwoNumbersTest() { var numberOne = driver.findElementByName("IntegerA"); var numberTwo = driver.findElementByName("IntegerB"); var compute = driver.findElementByName("ComputeSumButton"); var answer = driver.findElementByName("Answer"); numberOne.clear(); numberOne.setValue("5"); numberTwo.clear(); numberTwo.setValue("6"); compute.click(); Assert.assertEquals("11", answer.getAttribute("value")); }
Чтобы найти элементы, достаточно вызвать методы findElementBy у IOSDriver.
Поиск элементов внутри родительского элемента
@Test public void locatingElementsInsideAnotherElementTest() { var mainElement = driver.findElementByIosNsPredicate("type == \"XCUIElementTypeApplication\" AND name == \"TestApp\""); var numberOne = mainElement.findElementById("IntegerA"); var numberTwo = mainElement.findElementById("IntegerB"); var compute = mainElement.findElementByName("ComputeSumButton"); var answer = mainElement.findElementByName("Answer"); numberOne.clear(); numberOne.setValue("5"); numberTwo.clear(); numberTwo.setValue("6"); compute.click(); Assert.assertEquals("11", answer.getAttribute("value")); }
На уровне элементов есть аналогичные методы findElementBy, позволяющие находить элементы внутри других элементов.
Действия с жестами в Appium
Чтобы управлять касаниями, используется специальный класс TouchAction. С его помощью можно одновременно выполнять ряд действий.
Swipe (Свайп)
@Test public void swipeTest() { TouchAction touchAction = new TouchAction(driver); var element = driver.findElementById("IntegerA"); Point point = element.getLocation(); Dimension size = element.getSize(); touchAction.press(PointOption.point(point.getX() + 5, point.getY() + 5)) .waitAction(WaitOptions.waitOptions(Duration.ofMillis(200))) .moveTo(PointOption.point(point.getX() + size.getWidth() - 5, point.getY() + size.getHeight() - 5)) .release() .perform(); }
MoveTo (Перемещение)
@Test public void moveToTest() { TouchAction touchAction = new TouchAction(driver); var element = driver.findElementById("IntegerA"); Point point = element.getLocation(); touchAction.moveTo(PointOption.point(point)).perform(); }
Tap (Нажатие)
@Test public void tapTest() { TouchAction touchAction = new TouchAction(driver); var element = driver.findElementById("IntegerA"); Point point = element.getLocation(); touchAction.tap(TapOptions.tapOptions().withPosition(PointOption.point(point)).withTapsCount(2)).perform(); }
Перевод статьи «Getting Started with Appium for iOS Java on macOS in 10 Minutes».