From 0aff08f4abc7d11d55766a5ee5f52ba0afa59db8 Mon Sep 17 00:00:00 2001 From: Uladzislau Arlouski Date: Tue, 30 Mar 2021 13:00:12 +0300 Subject: [PATCH] [plugin-mobile-app] Add step to press sequence of keys --- .../plugins/pages/plugin-mobile-app.adoc | 23 ++++++++ .../bdd/mobileapp/steps/DeviceSteps.java | 55 +++++++++++++++++-- .../bdd/mobileapp/steps/DeviceStepsTests.java | 17 +++++- .../mobile_app/MobileAppStepsTests.story | 8 ++- 4 files changed, 96 insertions(+), 7 deletions(-) diff --git a/docs/modules/plugins/pages/plugin-mobile-app.adoc b/docs/modules/plugins/pages/plugin-mobile-app.adoc index be3945be9f..8c10d50eb3 100644 --- a/docs/modules/plugins/pages/plugin-mobile-app.adoc +++ b/docs/modules/plugins/pages/plugin-mobile-app.adoc @@ -635,4 +635,27 @@ When I press $key key When I press Home key ---- +=== Press keys + +Presses a sequence of https://github.com/appium/appium-xcuitest-driver#mobile-pressbutton[iOS keys] or https://appium.github.io/java-client/io/appium/java_client/android/nativekey/AndroidKey.html[Android keys] + +[source,gherkin] +---- +When I press keys:$keys +---- + +. `$keys` - The keys to press + +.Enter password +[source,gherkin] +---- +When I press keys: +|key| +|P | +|a | +|s | +|1 | +|$ | +---- + include::partial$generic-ui-steps.adoc[] diff --git a/vividus-plugin-mobile-app/src/main/java/org/vividus/bdd/mobileapp/steps/DeviceSteps.java b/vividus-plugin-mobile-app/src/main/java/org/vividus/bdd/mobileapp/steps/DeviceSteps.java index c9a874198f..9df6597364 100644 --- a/vividus-plugin-mobile-app/src/main/java/org/vividus/bdd/mobileapp/steps/DeviceSteps.java +++ b/vividus-plugin-mobile-app/src/main/java/org/vividus/bdd/mobileapp/steps/DeviceSteps.java @@ -17,12 +17,14 @@ package org.vividus.bdd.mobileapp.steps; import java.nio.file.Paths; +import java.util.List; import java.util.Map; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.Validate; import org.jbehave.core.annotations.When; +import org.jbehave.core.model.ExamplesTable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.vividus.mobileapp.action.DeviceActions; @@ -76,21 +78,64 @@ public void uploadFileToDevice(String filePath) * See iOS keys and * * Android keys for available values + *
+ * Example: + *
+ * + * When I press $key key + * * - * @param key key to press + * @param key the key to press */ @When("I press $key key") public void pressKey(String key) + { + pressKeys(List.of(key)); + } + + /** + * Presses the keys + *
+ * See iOS keys and + * + * Android keys for available values + *
+ * Example: + *
+ * + * When I press keys: + *
+ * |key | + *
+ * |Home| + *
+ * + * @param keys the keys to press + */ + @When("I press keys:$keys") + public void pressKeys(ExamplesTable keys) + { + pressKeys(keys.getColumn("key")); + } + + private void pressKeys(List keys) { if (genericWebDriverManager.isIOSNativeApp()) { - javascriptActions.executeScript("mobile: pressButton", Map.of("name", key)); + keys.forEach(key -> javascriptActions.executeScript("mobile: pressButton", Map.of("name", key))); } else { - AndroidKey androidKey = EnumUtils.getEnumIgnoreCase(AndroidKey.class, key); - Validate.isTrue(androidKey != null, "Unsupported Android key: %s", key); - webDriverProvider.getUnwrapped(PressesKey.class).pressKey(new KeyEvent(androidKey)); + PressesKey pressesKey = webDriverProvider.getUnwrapped(PressesKey.class); + keys.stream() + .map(key -> + { + AndroidKey androidKey = EnumUtils.getEnumIgnoreCase(AndroidKey.class, key); + Validate.isTrue(androidKey != null, "Unsupported Android key: %s", key); + return androidKey; + }) + .map(KeyEvent::new) + .forEach(pressesKey::pressKey); } } } diff --git a/vividus-plugin-mobile-app/src/test/java/org/vividus/bdd/mobileapp/steps/DeviceStepsTests.java b/vividus-plugin-mobile-app/src/test/java/org/vividus/bdd/mobileapp/steps/DeviceStepsTests.java index ea3535dcac..292b4dd791 100644 --- a/vividus-plugin-mobile-app/src/test/java/org/vividus/bdd/mobileapp/steps/DeviceStepsTests.java +++ b/vividus-plugin-mobile-app/src/test/java/org/vividus/bdd/mobileapp/steps/DeviceStepsTests.java @@ -35,6 +35,7 @@ import com.github.valfirst.slf4jtest.TestLoggerFactory; import com.github.valfirst.slf4jtest.TestLoggerFactoryExtension; +import org.jbehave.core.model.ExamplesTable; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -101,13 +102,24 @@ void shouldPressIOSKey() @Test void shouldPressAndroidKey() + { + performPressAndroidKeyTest(() -> deviceSteps.pressKey(AndroidKey.SPACE.name())); + } + + @Test + void shouldPressAndroidKeys() + { + performPressAndroidKeyTest(() -> deviceSteps.pressKeys(new ExamplesTable("|key|\n|SPACE|"))); + } + + private void performPressAndroidKeyTest(Runnable run) { ArgumentCaptor keyCaptor = ArgumentCaptor.forClass(KeyEvent.class); PressesKey pressesKey = mock(PressesKey.class); when(genericWebDriverManager.isIOSNativeApp()).thenReturn(false); when(webDriverProvider.getUnwrapped(PressesKey.class)).thenReturn(pressesKey); - deviceSteps.pressKey(AndroidKey.SPACE.name()); + run.run(); verify(pressesKey).pressKey(keyCaptor.capture()); @@ -118,10 +130,13 @@ void shouldPressAndroidKey() @Test void shouldNotPressUnsupportedAndroidKey() { + PressesKey pressesKey = mock(PressesKey.class); when(genericWebDriverManager.isIOSNativeApp()).thenReturn(false); + when(webDriverProvider.getUnwrapped(PressesKey.class)).thenReturn(pressesKey); IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> deviceSteps.pressKey("unsupported key")); assertEquals("Unsupported Android key: unsupported key", exception.getMessage()); verifyNoMoreInteractions(webDriverProvider, genericWebDriverManager); + verifyNoInteractions(pressesKey); } } diff --git a/vividus-tests/src/main/resources/story/system/mobile_app/MobileAppStepsTests.story b/vividus-tests/src/main/resources/story/system/mobile_app/MobileAppStepsTests.story index 6d4519d4f1..28eab22e75 100644 --- a/vividus-tests/src/main/resources/story/system/mobile_app/MobileAppStepsTests.story +++ b/vividus-tests/src/main/resources/story/system/mobile_app/MobileAppStepsTests.story @@ -14,12 +14,18 @@ Given I start mobile application with capabilities: |app |${app-url}| -Scenario: Verify steps: 'When I press $key key', 'Then number of $state elements found by `$locator` is $comparisonRule `$quantity`' and Text Part Filter and Text Filter +Scenario: Verify steps: 'When I press $key key', 'Then number of $state elements found by `$locator` is $comparisonRule `$quantity`', 'When I press keys:$keys' and Text Part Filter and Text Filter Then number of elements found by `xpath()->filter.text(Home)` is equal to `1` When I press Home key Then number of elements found by `xpath()->filter.text(Home)` is equal to `0` When I activate application with bundle identifier `${main-app}` When I wait until element located `xpath()->filter.textPart(om)` appears +When I press keys: +|key | +|Home| +Then number of elements found by `xpath()->filter.text(Home)` is equal to `0` +When I activate application with bundle identifier `${main-app}` +When I wait until element located `xpath()->filter.textPart(om)` appears Scenario: [Android] Verify step: 'When I change Appium session settings:$settings' and Id Locator