Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
В этой статье речь пойдет о тестировании 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».