При клике через JavascriptExecutor на input из shadow-root не появляется выпадающее окно

protractor
javascript
Теги: #<Tag:0x00007fedb9c30df8> #<Tag:0x00007fedb9c30c90>

(Igor Rozdobudko) #1

Всем привет!

Покажу на примере проблему.
Есть ресурс: https://www.mydriver.com/en

Нам необходимо ввести значение в поле pickupAt. Если вводим ручками - появляется предложение по локации, выбираем и идём дальше.

Необходимо это заавтоматизировать.
Загвоздка тут в том, что этот input находится в shadow-root. Protractor его не обрабатывает, никак, просто не видит (.deepCss бесполезно). Нашел решение кликать и вводить значение через javascriptExecutor
отдебажил в консоле:
document.getElementsByTagName("mdr-ibe")[0].shadowRoot.getElementById("pickup-input").value = "SFO";
В этом случае мы можем увидеть текст в поле, но сайт не открывает окно, где ты можешь выбрать твою локацию согласно тексту. То есть, задача - чтоб появилось выпадающее окно.

Что было сделано и что не сработало.

  1. document.getElementsByTagName("mdr-ibe")[0].shadowRoot.getElementById("pickup-input").click() - не сработало.
  2. Просто вбить финальное значение локации и нажать продолжить - не работает. Просит выбрать локацию.

Я использую Protractor. Может быть кто-то подскажет, как определить элемент из javascriptExecutor в Element и попробовать на нём вызвать код?


(Юрий Аксютин) #2

Вот как делаю я:

string javaScript = "document.evaluate("XPath", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.dispatchEvent(new MouseEvent(\"click\", {bubbles:true}))";

bubbles:true - чтобы событие всплывало

Вам важно узнать на каком элементе висит обработчик события и какого имененно события. Возможно появление предоложения по локации реагирует на потерю фокуса. В фаерфоксе вы можете это увидеть:


(Igor Rozdobudko) #3

Юра, спасибо большое!
Проблему решил через javascriptExecutor.


(Юрий Аксютин) #4

Не за что)
я не дописал, скрипт выполняем через javascriptExecutor:

javaScriptExecutor.ExecuteScript(javaScript, args);