Каков предполагаемый способ ввода текста в поле ввода ионного гибридного приложения с помощью appium?sendkeys: не может сфокусировать элемент - PullRequest
0 голосов
/ 01 апреля 2019

Appium Server v 1.9.1 Java-клиент Appium v6.1.0

Я использую Appium для автоматизации гибридного приложения, созданного с помощью Ionic 4. Все отлично работает, за исключением метода sendkeys в Appium (element.sendKeys ("«);).Пытаясь взаимодействовать с элементами, я могу без проблем нажимать на них, используя .click (), но если я пытаюсь отправить ключи, я получаю следующую ошибку «not focus element»:

Журналы клиента Appium Java:

org.openqa.selenium.WebDriverException: An unknown server-side error occurred while processing the command. Original error: unknown error: cannot focus element
  (Session info: chrome=73.0.3683.90)
  (Driver info: chromedriver=2.41.578737 (49da6702b16031c40d63e5618de03a32ff6c197e),platform=Windows NT 10.0.17134 x86_64)


at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
    at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:231)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:543)
    at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:42)
    at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)
    at io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1)
    at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:276)
    at io.appium.java_client.DefaultGenericMobileElement.execute(DefaultGenericMobileElement.java:45)
    at io.appium.java_client.MobileElement.execute(MobileElement.java:1)
    at io.appium.java_client.android.AndroidElement.execute(AndroidElement.java:1)
    at org.openqa.selenium.remote.RemoteWebElement.sendKeys(RemoteWebElement.java:100)

Журналы сервера Appium

[debug] [JSONWP Proxy] Proxying [POST /wd/hub/session/3c1b8a7a-a990-4ffa-be83-5b3fcc1d0a2c/element] to [POST http://127.0.0.1:5309/wd/hub/session/027c8d0e01db56c76726b5f3842aa1d2/element] with body: {"using":"css selector","value":"#logs-filter"}
[debug] [JSONWP Proxy] Got response with status 200: {"sessionId":"027c8d0e01db56c76726b5f3842aa1d2","status":0,"value":{"ELEMENT":"0.16747293389607476-4"}}
[JSONWP Proxy] Replacing sessionId 027c8d0e01db56c76726b5f3842aa1d2 with 3c1b8a7a-a990-4ffa-be83-5b3fcc1d0a2c
[HTTP] <-- POST /wd/hub/session/3c1b8a7a-a990-4ffa-be83-5b3fcc1d0a2c/element 200 76 ms - 107
[HTTP]
[HTTP] --> POST /wd/hub/session/3c1b8a7a-a990-4ffa-be83-5b3fcc1d0a2c/element/0.16747293389607476-4/value
[HTTP] {"id":"0.16747293389607476-4","text":"asd","value":["a","s","d"]}
[W3C] Driver proxy active, passing request on via HTTP proxy
[debug] [JSONWP Proxy] Matched '/wd/hub/session/3c1b8a7a-a990-4ffa-be83-5b3fcc1d0a2c/element/0.16747293389607476-4/value' to command name 'setValue'
[debug] [JSONWP Proxy] Proxying [POST /wd/hub/session/3c1b8a7a-a990-4ffa-be83-5b3fcc1d0a2c/element/0.16747293389607476-4/value] to [POST http://127.0.0.1:5309/wd/hub/session/027c8d0e01db56c76726b5f3842aa1d2/element/0.16747293389607476-4/value] with body: {"id":"0.16747293389607476-4","text":"asd","value":["a","s","d"]}
[debug] [JSONWP Proxy] Got response with status 200: {"sessionId":"027c8d0e01db56c76726b5f3842aa1d2","status":13,"value":{"message":"unknown error: cannot focus element\n  (Session info: chrome=73.0.3683.90)\n  (Driver info: chromedriver=2.41.578737 (49da6702b16031c40d63e5618de03a32ff6c197e),platform=Windows NT 10.0.17134 x86_64)"}}
[debug] [W3C] Encountered internal error running command: ProxyRequestError: Could not proxy command to remote server. Original error: The request to /wd/hub/session/3c1b8a7a-a990-4ffa-be83-5b3fcc1d0a2c/element/0.16747293389607476-4/value has failed
[debug] [W3C]     at JWProxy.proxy$ (C:\Users\jstrickland\AppData\Roaming\npm\node_modules\appium\node_modules\appium-base-driver\lib\jsonwp-proxy\proxy.js:182:13)
[debug] [W3C]     at tryCatch (C:\Users\jstrickland\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:67:40)
[debug] [W3C]     at GeneratorFunctionPrototype.invoke [as _invoke] (C:\Users\jstrickland\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:315:22)
[debug] [W3C]     at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (C:\Users\jstrickland\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:100:21)
[debug] [W3C]     at GeneratorFunctionPrototype.invoke (C:\Users\jstrickland\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:136:37)
[debug] [MJSONWP] Matched JSONWP error code 13 to UnknownError

Я подтвердил, что мой контекст и дескриптор окна верны (я не мог щелкнуть элемент, если это не так).

Мой вопрос: как это предназначено для работы?Является ли sendKeys предполагаемым способом отправки текста в элемент ввода html в ионном приложении с appium?Если так - это похоже на ошибку, так как у appium нет другого механизма для этого, и мне нужно отправить им отчет об ошибке.Но, возможно, это не тот путь, и я совершаю ошибку?

Некоторые мысли о том, почему это происходит: я предполагаю, что корень зла здесь в том, что элемент ионного ввода в реальности вызывает в воображении ребенкаэлемент ввода, который является стандартным элементом ввода в дереве HTML.Вы можете увидеть это с помощью осмотра Chrome.Я думаю, что appium запутывается, потому что пытается трактовать ионный вход как вход и ждет фокусировки ионного входа, а не элемента ввода.Это объясняет, почему я могу нажать на вещь, но не могу отправить ключи к ней.

В случае, если кто-то еще наткнется на это, вот некоторые обходные пути, которые я нашел, чтобы обойти это в настоящее время.

  • Вы можете использовать javascript для этого: driver.executeScript("arguments[0].setAttribute('value', arguments[1])", element, "text-to-send");
  • Вы можете щелкнуть элемент, а затем выполнить МНОГО ключевых событий IE:
    AndroidDriver d = (AndroidDriver) driver; d.pressKey(new KeyEvent(AndroidKey.A)); d.pressKey(new KeyEvent(AndroidKey.B)); d.pressKey(new KeyEvent(AndroidKey.c));

  • Вы можете выбрать дочерний элемент , который является стандартным входом, и выполнить sendkeys для этого элемента.

    List<MobileElement> l = e.findElements(By.cssSelector("*")); l.get(0).sendKeys(text);

...