Automatyzacja aplikacji mobilnych z wykorzystaniem Appium Flutter Driver

18.11.2025 | Iwona Lachowska

Wstęp

Automatyzacja stała się jednym z wiodących trendów w IT na przełomie ostatnich lat.  Umożliwia skrócenie czasu realizacji zadań, monitorowanie procesów oraz zaadresowanie mniej kreatywnych zadań na rzecz podejmowania przez zespół tych bardziej złożonych. Współcześnie cykl wydawniczy aplikacji staje się coraz krótszy ze względu na rosnące oczekiwania klientów.

Testowanie manualne przestaje być wystarczające w obliczu tak dynamicznie zachodzących zmian, a zarazem jest bardzo kosztowne oraz mało skalowalne. Zadaniem automatyzacji nie jest eliminacja roli człowieka, a odciążenie go w bardziej powtarzalnych czynnościach, jak chociażby regresja aplikacji w procesie wydawniczym.

Flutter oraz możliwość tworzenia multiplatformowych aplikacji

Aplikacje mobilne na przełomie ostatnich lat stały się głównym kanałem komunikacji z klientem dla wielu organizacji. Obecnie dostępne są różne rozwiązania m.in. natywne (dla Android – Java/Kotlin, dla iOS – Swift/Objective-C), hybrydowe (Ionic, Cordova) oraz cross-platformowe (Flutter, Kotlin Multiplatform, React Native). Wartą uwagi jest ostatnia z wymienionych grup, gdyż umożliwia tworzenie oprogramowania na obydwie platformy poprzez wytworzenie jednego kodu źródłowego. W efekcie podejście multiplatformowe skraca czas developmentu oprogramowania oraz obniża koszt jego utrzymania.

Dynamicznie rozwijający się Flutter, stworzony przez zespół Google, dzięki podejściu cross-platformowemu i posiadaniu własnego silnika renderującego pozwala dostarczać wydajne, a zarazem spójne pod kątem GUI aplikacje mobilne. Podejście to od kilku lat z sukcesem stosowane jest w rozwoju aplikacji mobilnej ING Business.

Narzędzia do automatyzacji aplikacji mobilnych

Wzrost zainteresowania aplikacjami mobilnymi, ich prężny rozwój i przyrost przyczynił się do rozkwitu narzędzi wspierających automatyzację.

W przypadku aplikacji mobilnych najczęściej spotykanymi narzędziami są:

  1. Appium
  2. NightwatchJS
  3. Calabash
  4. XCUITest
  5. EarlGrey 
  6. Selendroid
  7. Espresso
  8. Robotium

Co ważne, nie każde z wyżej wymienionych narzędzi umożliwia automatyzację obydwu platform. Dużą popularnością cieszy się Appium, rozwiązanie typu open source bazujące na Selenium WebDriver oraz dające możliwość pisania skryptów w różnych językach (Java, JavaScript, PHP, Ruby, Python, C#). Ma ono niski próg wejścia dla osób posiadających doświadczenie w automatyzacji aplikacji webowych w Selenium. Konfiguracja oraz zarządzanie testami są podobne. Appium jest wręcz rozszerzeniem Selenium, implementując protokół WebDriver oraz umożliwiając testowanie aplikacji webowych na platformach mobilnych tj. Android i iOS.

Klucze w aplikacji mobilnej

Do realizacji testów automatycznych z wykorzystaniem Appium Flutter Driver niezbędne jest dodanie kluczy w kodzie źródłowym aplikacji mobilnej. Tworzenie kluczy na poziomie widgetów we Flutterze nie jest skomplikowane. Do badania drzewa zależności bardzo pomocne jest narzędzie Flutter Inspector, które dostępne jest w IDE tj. Android Studio czy Visual Studio Code.

Podgląd drzewa w Flutter Inspector

Podgląd umożliwia weryfikację parametrów widgetów oraz zależności między nimi. Z tego poziomu możliwe jest ustalenie miejsca, w którym powinien zostać dodany nowy klucz lub znalezienie już istniejącego.

key: ValueKey('Correct answer info text'),

Podczas dodawania kluczy należy zwrócić uwagę, czy na tej samej stronie nie są dodane dwa klucze o identycznej wartości, gdyż przy późniejszej automatyzacji może powodować to występowanie błędów. W takiej sytuacji warto zastosować indeksowanie lub dodawanie zmiennych parametrów, które wskazywałyby konkretny widget.

Użycie kluczy

Klucze odgrywają istotną rolę w procesie unikalnej identyfikacji widgetów w celu efektywnego zarządzania drzewem, zapobiegania nieoczekiwanej przebudowie oraz zachowaniu ich stanu. Ponadto mają wpływ w procesie automatyzacji testów aplikacji mobilnej.

Typy selektorów do lokalizowania elementów w drzewie

Podczas automatyzacji GUI niezbędne są selektory, czyli zlokalizowane elementy lub grupy elementów na ekranie, względem których podejmowane są akcje. W przypadku automatyzacji aplikacji mobilnych, napisanych we frameworku Flutter pomocne są – Appium Flutter Driver oraz Appium Flutter Finder. Przy tej okazji warto omówić dostępne metody lokalizowania elementów:

  1. find.text() – wyszukiwanie widgetów posiadających wskazany tekst;
  2. find.byValueKey() – wyszukiwanie widgetów posiadających wskazany klucz;
  3. find.byType() – wyszukiwanie widgetów na podstawie ich typu (klasy);
  4. find.descendant() – wyszukiwanie widgetów będących potomkiem innego, wskazanego widgetu;
  5. find.ancestor() - wyszukiwanie widgetów będących przodkiem innego, wskazanego widgetu;
  6. find.bySemanticsLabel() – wyszukiwanie widgetów po etykiecie;
  7. find.byTooltip() – wyszukiwanie widgetów na podstawie tekstu zawartego w podpowiedzi obiektu.

Poniżej znajdziesz przykłady wykorzystania powyższych selektorów w kodzie:

Przykłady wykorzystania selektorów w kodzie

Konfiguracja testów automatycznych

Do wykorzystania Appium Flutter Drivera poza standardową konfiguracją Appium niezbędne również będzie:

  1. Dodanie zależności w projekcie testów automatycznych, zgodnie z dokumentacją Appium Flutter Driver.
  2. Dodanie w konfiguracji testów automatycznych parametru automationName z wartością „Flutter”.
  3. Dodanie rozszerzenia enableFlutterDriverExtension() do pliku konfiguracyjnego instalacji aplikacji mobilnej. Rozszerzenie jest wymagane dla testów korzystających package:flutter_driver.

Appium-flutter-driver w akcji

Posiadając już skonfigurowany projekt testów automatycznych pod Appium Flutter Driver
oraz zainstalowaną aplikację z kluczami i stosowną konfiguracją, możliwa jest realizacja scenariuszy testowych. Driver dostarcza szereg metod, dokładnie opisanych w dokumentacji projektu. Poza standardowym klikaniem, wprowadzaniem tekstu, czy scrollowaniem, dostępne jest także jawne oczekiwanie na elementy. Przykładowo, zamiast oczekiwać określony czas wskazany w teście, możliwe jest oczekiwanie na konkretny parametr (np. klikalność lub widoczność) ustalając maksymalny czas oczekiwania.

getDriver().executeScript("flutter: waitForTappable", element, timeToWait);

Wykorzystując Appium Flutter Drivera zawsze istnieje alternatywa rozpoznania i zmiany kontekstu testów automatycznych, np. na natywny, o ile jest dostępny w czasie przejścia skryptu. Wymagane są wtedy selektory oraz metody natywne. Po wykonaniu akcji w części natywnej, powrót do kontekstu Fluttera nie rodzi problemów, o ile driver jest w stanie go wykryć.

Zmiana kontekstu Fluttera

Podsumowanie

Rozwiązania typu cross-platformowego niosą ze sobą szereg korzyści takich jak skrócenie procesu wytwórczego poprzez wspólny kod bazowy dla różnych platform. Na przykładzie Fluttera zauważalne jest skrócenie czasu realizacji nowych przypadków testowych w testach automatycznych. Dzięki kluczom możliwe jest tworzenie selektorów dla obu platform. Zachowanie aplikacji poza czysto natywnymi aspektami także powinno być spójne, więc umożliwia tworzenie jednego, bazowego skryptu, weryfikującego te same funkcjonalności.

Stosowanie Appium Flutter Drivera nie ogranicza możliwości automatyzacji natywnej części aplikacji mobilnej. W trakcie działania przejście na kontekst natywny nie jest skomplikowane, a powrót do kontekstu Fluttera również nie jest problematyczny.

Na podstawie kilkuletniego doświadczenia w automatyzacji testów śmiało mogę polecić wskazane rozwiązanie. Pomimo drobnych trudności związanych z lokalizowaniem elementów, praca z narzędziem jest intuicyjna i skraca czas realizacji skryptów dla obydwu platform. Mając dostęp do kodu bazowego aplikacji mobilnej, możemy dodawać klucze, a w efekcie mamy kontrolę nad elementami, których potrzebujemy do realizacji testów automatycznych. Dodatkowo zachowując standardy wzorca projektowego Page Object Model, tworzenie nowych testów jest bardzo proste i przejrzyste, zwłaszcza dla osób posiadających doświadczenie w automatyzacji z wykorzystaniem Selenium.