From 3ad32944f2959d93c5e67936af2b41ce7d94d571 Mon Sep 17 00:00:00 2001 From: Mykola Mokhnach Date: Wed, 4 Jul 2018 09:39:53 +0200 Subject: [PATCH 1/2] Map sending keys to active element for W3C compatibility --- .../remote/AppiumW3CHttpCommandCodec.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/appium/java_client/remote/AppiumW3CHttpCommandCodec.java b/src/main/java/io/appium/java_client/remote/AppiumW3CHttpCommandCodec.java index 0b1a86421..a78b5524e 100644 --- a/src/main/java/io/appium/java_client/remote/AppiumW3CHttpCommandCodec.java +++ b/src/main/java/io/appium/java_client/remote/AppiumW3CHttpCommandCodec.java @@ -27,12 +27,18 @@ import static org.openqa.selenium.remote.DriverCommand.SET_TIMEOUT; import static org.openqa.selenium.remote.DriverCommand.SUBMIT_ELEMENT; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import org.openqa.selenium.interactions.KeyInput; +import org.openqa.selenium.interactions.Sequence; import org.openqa.selenium.remote.http.W3CHttpCommandCodec; +import java.util.Collection; import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class AppiumW3CHttpCommandCodec extends W3CHttpCommandCodec { - /** * This class overrides the built-in Selenium W3C commands codec, * since the latter hardcodes many commands in Javascript, @@ -44,6 +50,7 @@ public AppiumW3CHttpCommandCodec() { defineCommand(GET_ELEMENT_ATTRIBUTE, get("/session/:sessionId/element/:id/attribute/:name")); defineCommand(IS_ELEMENT_DISPLAYED, get("/session/:sessionId/element/:id/displayed")); defineCommand(GET_PAGE_SOURCE, get("/session/:sessionId/source")); + defineCommand(SEND_KEYS_TO_ACTIVE_ELEMENT, post("/session/:sessionId/actions")); } @Override @@ -69,6 +76,24 @@ public void alias(String commandName, String isAnAliasFor) { // This blocks parent constructor from undesirable parameters amending switch (name) { case SEND_KEYS_TO_ACTIVE_ELEMENT: + Object rawValue = parameters.get("value"); + //noinspection unchecked + Stream source = (rawValue instanceof Collection) + ? ((Collection) rawValue).stream() + : Stream.of((CharSequence[]) rawValue); + String text = source + .flatMap(Stream::of) + .collect(Collectors.joining()); + + final KeyInput keyboard = new KeyInput("keyboard"); + Sequence sequence = new Sequence(keyboard, 0); + for (int i = 0; i < text.length(); ++i) { + sequence.addAction(keyboard.createKeyDown(text.charAt(i))) + .addAction(keyboard.createKeyUp(text.charAt(i))); + } + return ImmutableMap.builder() + .put("actions", ImmutableList.of(sequence.toJson())) + .build(); case SEND_KEYS_TO_ELEMENT: case SET_TIMEOUT: return super.amendParameters(name, parameters); From 5d27e81bd65865bf33eced1a5d85513abf44930e Mon Sep 17 00:00:00 2001 From: Mykola Mokhnach Date: Wed, 4 Jul 2018 12:18:29 +0200 Subject: [PATCH 2/2] fix linter --- .../io/appium/java_client/remote/AppiumW3CHttpCommandCodec.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/io/appium/java_client/remote/AppiumW3CHttpCommandCodec.java b/src/main/java/io/appium/java_client/remote/AppiumW3CHttpCommandCodec.java index a78b5524e..aec7ebd75 100644 --- a/src/main/java/io/appium/java_client/remote/AppiumW3CHttpCommandCodec.java +++ b/src/main/java/io/appium/java_client/remote/AppiumW3CHttpCommandCodec.java @@ -29,6 +29,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; + import org.openqa.selenium.interactions.KeyInput; import org.openqa.selenium.interactions.Sequence; import org.openqa.selenium.remote.http.W3CHttpCommandCodec;