Appium для iOS на Java под macOS: настройка за 10 минут

🔥 Важное для QA-специалистов! 🔥
В QaRocks ты найдешь туториалы, задачи и полезные книги, которых нет в открытом доступе. Уже более 15.000 подписчиков – будь среди нас! Заходи к нам в телеграм канал QaRocks

В этой статье речь пойдет о тестировании iOS-приложений. Разберем, как подготовить окружение для тестирования iOS-приложений — что необходимо установить и как настроить симуляторы. Далее — как запустить приложение в симуляторе и выполнять действия с помощью автотестов.

Содержание:

Что такое Appium?

Appium — это фреймворк с открытым исходным кодом для автоматизации тестирования нативных, гибридных и мобильных веб-приложений. Он работает с iOS, Android и Windows с помощью протокола WebDriver . Appium считается стандартом для автоматизации мобильного тестирования.

Настройка окружения

1. Установите Java Development Kit (JDK) версии 7 или выше

2. Установите NodeJs

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 можно просматривать элементы в исходнике.

Поиск локаторов в iOS с помощью 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».

🔥 Какой была ваша первая зарплата в QA и как вы искали первую работу? 

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

Читать в телеграм

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *