Por que utilizar a Appium Mobile Actions em seus testes automatizados?

Matheus Bereta
4 min readJul 11, 2024

--

Primeiramente, gostaria de trazer um pouco de contexto e motivações! Pensando na combinação de linguagem de programação Java e no framework de testes mobile Appium, chegamos ao java-client.

1ª motivação:

O java-client, até a sua versão 7.6.0, entregava a classe TouchAction, a qual era possível realizar diversas ações de toque, com uma boa personalização. A partir da versão 8.0.0 a classe TouchAction foi deprecada.

Dimension dimension = driver.manage().window().getSize();

int startX = (int)(dimension.width * 0.5);
int startY = (int)(dimension.height * 0.9);
int endX = (int)(dimension.width * 0.2);
int endY = (int)(dimension.height * 0.1);

TouchAction touch = new TouchAction(driver);

touch.press(PointOption.point(startX, startY))
.waitAction(WaitOptions.waitOptions(Duration.ofSeconds(1)))
.moveTo(PointOption.point(endX, endY))
.release()
.perform();

2ª motivação:

Pegando a mesma ação da motivação anterior (scroll), é possível de ser realizada utilizando a classe Sequence e as demais classes do package interactions do Selenium. O problema que eu vejo dessa implementação, é a verbosidade e quão manual é essa automatização, ou seja, é necessário declarar cada etapa da movimentação de um dedo para realizar um scroll.

Dimension dimension = driver.manage().window().getSize();

Point start = new Point((int)(dimension.width * 0.5), (int)(dimension.height * 0.9));
Point end = new Point((int)(dimension.width * 0.2), (int)(dimension.height * 0.1));

Sequence scroll = new Sequence(FINGER, 1)
.addAction(FINGER.createPointerMove(ofMillis(0), viewport(), start.getX(), start.getY()))
.addAction(FINGER.createPointerDown(LEFT.asArg()))
.addAction(FINGER.createPointerMove(ofMillis(duration), viewport(), end.getX(), end.getY()))
.addAction(FINGER.createPointerUp(LEFT.asArg()));

driver.perform(Arrays.asList(scroll));

3ª motivação:

Os drivers, UiAutomator2 (Android) e XCUITest (iOS), fornecem diversas extensões de comando personalizadas para executar cenários específicos. Esses comandos possuem uma boa documentação e personalização dos scripts, além de serem nativos dos drivers. Seguindo o case do scroll, os scripts para Android e iOS ficam dessa forma:

// Android
driver.executeScript("mobile: scrollGesture", ImmutableMap.of("direction", "down", "percent", 1.0));

//iOS
driver.executeScript("mobile: scroll", ImmutableMap.of("direction", "down"));

Agora sim, por que utilizar a Appium Mobile Actions?

O Appium visa dar suporte para automação via UI para muitas stacks diferentes (mobile, desktop, web, etc.), e inclusive dentro da stack, como o mobile, é possível realizar testes para as plataformas Android e iOS dentro do mesmo projeto de testes, que é uma das suas principais utilizações, se não a principal.

Essa versatilidade do Appium (principalmente após o Appium 2) se dá por ser orientado a drivers e plugins, e então, conectando com a terceira motivação, podemos utilizar as extensões de comando para Android e iOS.

Mas pensando em um projeto de testes que valida um app Android e iOS, teríamos que sempre fazer a checagem de qual é a plataforma alvo do teste antes de executar um script, e é aí que entra a Appium Mobile Actions!

A biblioteca já faz essa validação e executa o script correto para cada plataforma.

AppiumActions actions = new AppiumActions(driver);

actions.gesture.scroll(Direction.DOWN, 0.8);

Variações de argumentos

Alguns scripts possuem diversas formas de serem montados, passando diferentes argumentos e estratégias, e a lib já prevê essas variações e entrega os métodos personalizados.

boolean removeApp(String appId);
boolean removeApp(String appId, int timeout);
boolean removeApp(String appId, boolean keepData);
boolean removeApp(String appId, int timeout, boolean keepData);

void installApp(String appPath);
void installApp(String appPath, boolean checkVersion);
void installApp(String appPath, int timeout);
void installApp(String appPath, boolean checkVersion, int timeout);

Documentação completa

Tanto o driver do Android (UiAutomator2) assim como o do iOS (XCUITest), entregam uma documentação muito rica e fiz questão de deixar isso evidente na biblioteca. Também está claro na documentação quais parâmetros estão disponíveis em cada plataforma.

/**
* Terminates the app on the iOS device with a specified timeout.
*
* @param driver the AppiumDriver instance to interact with the device.
* @param appId the bundleId of the app to be terminated.
* @param timeout the timeout in seconds after which the app will be terminated. <b>Currently not supported on the iOS platform.</b>
* @see <a href="https://github.com/appium/appium-xcuitest-driver/blob/master/docs/reference/execute-methods.md#mobile-terminateapp">XCUITest - terminateApp</a>
*/
@Override
public void terminateApp(AppiumDriver driver, String appId, int timeout) {
driver.executeScript("mobile: terminateApp", Map.of("bundleId", appId));
}

Funcionalidades e Roadmap

Na primeira versão da lib, ela entrega 19 scripts com diversas variações de acordo com os argumentos. Nesse momento, os drivers do Android e iOS entregam mais de 90 scripts cada e todos estão no roadmap da biblioteca, serão implementados conforme a priorização através de issues.

Open Source

A ideia é realizar uma construção em conjunto com a comunidade de engenheiros de software e qualidade que utilizam o Appium com Java para facilitar a automatização dessas ações que normalmente causam dor de cabeça durante a construção de scripts de testes automatizados. Sinta-se convidado a contribuir!

--

--