Прошло около 3 месяцев с тех пор, как я вернулся к Java для автоматизации тестирования, и, что ж, это освежающее изменение, так как большая часть моего недавнего опыта была связана с Javascript. Мягко говоря, Java 2022 года сильно отличается от того, что было в 2017 году, и разве мы не любим ее за все это!

Я утверждаю, что Javascript (и, конечно, Typescript тоже) прекрасно подходит для автоматизации тестирования; в основном потому, что многие пакеты готовы, прямо там и прямо сейчас, чтобы выполнить любой уровень тестирования белого ящика. Но обратная сторона, как и все в тенденциях, заключается в том, что все внимание уделяется новым, а старым, выдающимся, и в данном случае оригинальному языку автоматизации тестирования Java, досталось все FOMO.

Фактически, Java-клиент для Appium по-прежнему подходит для React-Native, а также для Flutter, для которого я собираюсь поделиться своим опытом, пытаясь заставить автоматизацию работать для примера приложения, которое они поставляют как часть установки Flutter.

Итак, без лишних слов, давайте проясним некоторые вопросы в Java-клиенте, когда вы исходите из всей интернет-литературы об автоматизации Flutter в Javascript.

  1. Нужно ли нам как-то интегрировать «appium-flutter-driver»? Ответ: Нет. Это действительно для тестирования белого ящика в Javascript/Typescript. Для последнего приложения не требуется находить или выполнять действия с мобильными элементами.
  2. Нужно ли нам переключать драйвер appium на «FLUTTER-CONTEXT»?
    Ответ: Нет, то же объяснение, что и выше.
  3. Нужно ли нам каждый раз вызывать execute_script, чтобы мелкие вещи работали? Ответ: в основном нет. Для простых операций с мобильными элементами, таких как идентификация, щелчок, получение текста и т. д. Appium, готовый к использованию, работает хорошо.

Раскладка элементов в приложении Flutter — Android

Как видно из приведенного выше примера, мобильные элементы имеют параметры content-desc, которые можно использовать для идентификации мобильных элементов.

Предварительные действия

  1. Создайте свое флаттер-приложение для эмулятора Android
  2. Определите местоположение APK для отладки, обычно это my_app/build/app/outputs/apk/debug/app-debug.apk.
  3. Запустите свой сервер appium по умолчанию

Собираем все вместе

//pseudo code, modify according to your setup..
...
public class Sample {
   private final String URL_STRING = "http://127.0.0.1:4723/wd/hub";
   private URL url;
   private DesiredCapabilities capabilities;
   private AppiumDriver driver;
   public void androidTest() throws MalformedURLException, InterruptedException {
      System.out.println("Android Test");
      url = new URL(URL_STRING);
      capabilities =new DesiredCapabilities();
      capabilities.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 300);
      capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UiAutomator2");
      capabilities.setCapability(MobileCapabilityType.DEVICE_NAME,"emulator-5554");
      capabilities.setCapability(MobileCapabilityType.PLATFORM,"android");
      capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION,"12");
      capabilities.setCapability(MobileCapabilityType.NO_RESET, "false");
      capabilities.setCapability(MobileCapabilityType.APP,
            "my_app/build/app/outputs/apk/debug/app-debug.apk");
      driver = new AndroidDriver(url, capabilities);
      driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
      System.out.println("Android Driver Initialized");
      MobileElement pageHeading = (MobileElement) driver.findElement(By.
            xpath("//*[@content-desc='Flutter Demo Home Page']"));
      MobileElement countText = (MobileElement) driver.findElement(By.
            xpath("//*[@content-desc='You have pushed the button this many times:']"));
      MobileElement countValue = (MobileElement) driver.findElement(By.
            xpath("//*[@content-desc='You have pushed the button this many times:']/following-sibling::android.view.View"));
      MobileElement incrementButton = (MobileElement) driver.findElement(By.
            xpath("//*[@content-desc='Increment']"));
      Assert.assertTrue(pageHeading.isDisplayed());
      Assert.assertTrue(countText.isDisplayed());
      Assert.assertEquals(countValue.getAttribute("content-desc"), "0");
      System.out.println("Asserted Initial Count: 0");
      Assert.assertTrue(incrementButton.isDisplayed());
      incrementButton.click();
      System.out.println("Clicked Increment");
      Thread.sleep(5*1000);
      Assert.assertEquals(countValue.getAttribute("content-desc"), "1");
      System.out.println("Asserted Updated Count: 1");
      System.out.println("Android Test: Success");
   }
   ...
}

Оставайтесь с нами для части 2, истории iOS, и вот она — https://sandeepqaops.medium.com/flutter-ios-app-test-automation-using-appium-java-client-61d1364d4562

Удачной автоматизации тестирования!