browser.keys () не работает в Firefox 53.0 и webdriver.io

В firefox ошибка выброса browser.keys.

Os: MacOs
Firefox version: 53.0.3
Geckodriver: 0.16.1
Webdriver.io: 4.8

Пожалуйста, помогите мне, как справиться с этой ошибкой.

Вот журналы

[17:11:35]  COMMAND POST     "/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/url"
[17:11:41]  COMMAND POST     "/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/refresh"
[17:11:45]  COMMAND GET      "/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/window/current/size"
[17:11:46]  COMMAND POST     "/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/elements"
[17:11:46]  COMMAND GET      "/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/element/0/displayed"
[17:11:46]  COMMAND GET      "/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/element/1/displayed"
[17:11:46]  COMMAND POST     "/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/elements"
[17:11:46]  COMMAND GET      "/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/element/0/displayed"
[17:11:46]  COMMAND GET      "/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/element/1/displayed"
[17:11:46]  COMMAND POST     "/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/elements"
[17:11:47]  COMMAND POST     "/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/element/0/value"
WARNING: the "keys" command will be depcrecated soon. Please use a different command in order to avoid failures in your test after updating WebdriverIO.
[17:11:47]  COMMAND POST     "/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/keys"
[17:11:47]  COMMAND GET      "/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/screenshot"
[17:11:48]      Saved screenshot: ERROR_firefox_2017-06-03T00-11-47.734Z.png
[17:11:48]  COMMAND DELETE   "/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/cookie"
Error: sendKeysToActiveElement
Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
System info: host: 'xxx.local', ip: '10.142.4.252', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.12.5', java.version: '1.8.0_131'
Driver info: driver.version: RemoteWebDriver
Error: The requested resource could not be found, or a request was received using an HTTP method that is not supported by the mapped resource.
    at Object.wait (/Users/xxxx/c3web/xxxx/node_modules/fibers/future.js:449:15)
    at Object.keys (/Users/xxxxx/node_modules/wdio-sync/build/index.js:264:31)
    at Object.exports.customCommands.selector (/Users/xxx/c3web/xxxx/testlib/browser/customCommands.js:158:17)
    at /Users/xxxx/node_modules/wdio-sync/build/index.js:191:29
    - - - - -
    at keys("Enter") - index.js:244:37
    at elementIdValue("0", "xxxyyyzzz") - index.js:293:3

person LookAtSrc    schedule 03.06.2017    source источник


Ответы (3)


Как отметил @iamdanchiv в своем ответе, browser.keys() будет устаревшим, но есть обходной путь (и я должен отправить PR для этого).

Под капотом browser.keys() вызывается конечная точка /session/:sessionId/keys в протоколе WebDriver JsonWire. Однако, если вы посмотрите на список конечных точек в спецификации W3C Webdriver этой конечной точки нет в списке. Я считаю, что раньше он был в списке, но был исключен. Вместо этого для отправки ключей в спецификации указано, что вместо этого используется конечная точка /session/:sessionId/element/:elementId/value, для вызова которой вы можете использовать метод browser.elementIdValue(ID, value) webdriverio.

Теперь, если вы прочитали спецификации /session/:sessionId/keys, упомянутые в документации Selenium по JsonWireProtocol довольно просто воспроизвести реализацию с использованием других функций WebDriver. Конечная точка /session/:sessionId/keys просто делает это:

Посылает последовательность нажатий клавиш активному элементу.

Существует конечная точка, которую мы можем вызвать, чтобы захватить текущий активный элемент, которым является /session/:sessionId/element/active, который сопоставлен с методом browser.elementActive() webdriverio.

В таком случае все, что нам нужно сделать, это заново реализовать этот browser.keys(), это сначала выяснить, какой элемент является активным, а затем отправить ключи этому элементу.

Итак, это обходное решение, если вы хотите отправить browser.keys("hello world"):

var result = browser.elementActive();
var activeElement = result.value && (result.value.ELEMENT || result.value["element-6066-11e4-a52e-4f735466cecf"]);
// Newer versions of the webdriver like Gecko/IEDriver return the element as "element-6066-11e4-a52e-4f735466cecf" (which is documented in the W3C specs) instead of "ELEMENT".
if(activeElement){ 
     browser.elementIdValue(activeElement, "hello world");
}

Обратите внимание, что это не точно повторяет поведение /session/:sessionId/keys, что также соответствует документации Selenium:

Эта команда похожа на команду send keys во всех аспектах, за исключением неявного завершения: модификаторы не освобождаются в конце вызова. Скорее, состояние клавиш-модификаторов сохраняется между вызовами, поэтому взаимодействия с мышью могут выполняться, пока клавиши-модификаторы нажаты.

Приведенное выше решение неявно освобождает клавиши-модификаторы, такие как «SHIFT», «CTRL», в конце последовательности клавиш. Так что, если вы хотите удерживать клавишу и взаимодействовать с мышью, тогда невезучий приятель, возможно, нам придется подождать, пока браузеры реализуют API Webdriver Actions. Но если все, что вы хотели сделать, это отправить «CTRL» + «C», вы просто можете отправить массив ключей, подобный этому:

var result = browser.elementActive();
var activeElement = result.value && result.value.ELEMENT;
if(activeElement){ 
     browser.elementIdValue(activeElement, ["CTRL", "c"]);
}
person Shi Ling    schedule 23.06.2017
comment
Для меня не было свойства ELEMENT, но был объект в свойстве value с ключом element + некоторая случайная строка со значением некоторой случайной строки. Так что у меня это сработало: let result = browser.elementActive(); let activeElement = (result.value as any)[Object.keys(result.value)[0]]; if (activeElement) { browser.elementIdValue(activeElement, key); } Спасибо за ответ !! - person AliF50; 27.06.2018
comment
Да, WC3 изменил спецификации для возврата ELEMENT, теперь используется ключ element-6066-11e4-a52e-4f735466cecf, который теперь использует более новые версии GeckoDriver для FF и, насколько мне известно, IEDriver. Обходной путь для строки 2: var activeElement = result.value && (result.value.ELEMENT || result.value["element-6066-11e4-a52e-4f735466cecf"]) - person Shi Ling; 19.07.2018
comment
так какое же решение? browser.elementIdValue(activeElement, ["CTRL", "c"]);? - person Gobliins; 13.03.2020
comment
К сожалению, elementIdValue больше нет в WDIO5 - person Gobliins; 13.03.2020

Что ж, эта ошибка в значительной степени объясняет, что существует проблема с реализацией команды keys: WARNING: the "keys" command will be depcrecated soon. Please use a different command in order to avoid failures in your test after updating WebdriverIO..

В настоящее время он работает только с chromedriver в моих тестовых примерах, но я также не могу связывать с ним команды. (смоделировать Ctrl+C, Ctrl+V).

См. Мой ответ на this вопрос. Вам придется найти другой способ обойти это или дождаться, пока драйверы (chromedriver, geckodriver и т. Д.) Реализуют новые методы Selenium actions.

Ответ, который я дал там, в значительной степени охватывает всю проблему. Кроме того, вы можете попробовать codepoint подход: browser.keys("\uE007").

Надеюсь, это вам поможет!

person iamdanchiv    schedule 05.06.2017

Попробуйте с версией webdriverio> v4.9.3, похоже, они исправили это: https://github.com/webdriverio/webdriverio/commit/1f1db4583f62c60c7907f14c080603376e7ec52b

person Oliver Wolf    schedule 10.12.2017