WebDriver.SendKeys и событие onchange


(Павел Смолкин) #1

Всем привет!
Наткнулся на такую странную особенность.
При вызове метода SendKeys() не вызывается событие на странице onchange="aspxETextChanged(...)"
Это при включенных Native Events. Если выключить - все работает. Хотя мне казалось, что скорее будет наоборот.
В общем, SendKeys не эмулирует нажатие клавиш, а как-будто вставляет строку из буфера.
Есть какой-то способ вызвать onchange врукопашную? Потому как хотелось бы запускать тесты на разных браузерах. Раньше, я так понял, был метод FireEvent. Но в текущей версии (2.44) ничего подобного я не обнаружил.
п.с. Погуглить мне тоже не помогло smile

UPD:
Native Events ни при чем!
В общем, удалось локализовать проблему и выработать рецепт костылей.
Не знаю, что это баг или.... ну вы поняли.
В общем, отправленные вебдрайвером в инпут DevExpress компонента символы не вызывают событие(я) до тех пор, пока эти символы кириллица expressionless
То есть, к примеру, если вводим фразу "Московский филиал", то событие change случается только после пробела!
Так что я склонен полагать, что это особенность реализации отправки "нетипичных" клавиатурных символов методом SendKeys().

Костыль в моем случае - пробел после каждой строки, которую ввожу в инпут.
А вызов события скриптом почему-то очищал value.
п.с. пардон за мой французский.

еще UPD
сделал небольшой пример, где каждый может убедиться, что я не вру.


(Sergey Korol) #2

А какой браузер / версия?


(Павел Смолкин) #3

chrome 39 и ff 32

попробовал пойти по пути
IJavaScriptExecutor js = WebBrowser.Driver as IJavaScriptExecutor;
js.ExecuteScript(" ??? ");

осталось, видимо, написать javascript


(Александр Шиповалов) #4

Для хрома ведь нет нативных событий?


(Sergey Korol) #5

Скорее наоборот.

Как же вы выключали native events у хрома? И какую версию хром драйвера используете? Я видел всего лишь раз такое поведение (вставка, как из буфера), и то, это был какой-то древний IE. На Chrome и FF такого никогда не встречал.


(Павел Смолкин) #7

Вроде же наоборот?
https://code.google.com/p/selenium/wiki/AdvancedUserInteractions

такое предположение я сделал исходя из таблицы выше и из того, что параметр
FirefoxProfile.EnableNativeEvents по умолчанию true. И при параметрах по умолчанию что в хроме, что фф картина не меняется.
Для фф стоит установить false - все работает так, как и было задумано.

chromeDriver 2.10


(Sergey Korol) #8

Мы смотрим на разные таблицы?

Browser 	Operating system	Native events   	Synthetic events
Firefox 	    Linux	        supported	        supported (default)
Firefox 	   Windows	        supported (default)	supported
IE      	   Windows	        supported (default)	not supported
Chrome  	Linux/Windows   	supported*	        not supported
Opera   	Linux/Windows	        supported (default)	not supported
HtmlUnit        Linux/Windows   	supported (default)	not supported

(Павел Смолкин) #9

Все так. Работает, естественно, только в ФФ, потому что только там и можно выключить native.


(Sergey Korol) #10

К чему тогда было:

в ответ на мое сообщение? smile Или вопрос относился к @alshipovalov?


(Павел Смолкин) #11

2е!
Не совсем разобрался с местным интерфейсом, но рад, что все же понимание нашлось smile

Вопрос "что делать" остается открытым.


(Sergey Korol) #12

А сайт есть в паблик доступе?


(Павел Смолкин) #13

Увы..
Все что могу сказать: написан на .net, комбобокс DevExpress. В него и посылаю символы. Должны вываливаться лист-бокс и проверяться введенные данные, но ничего не происходит.


(Павел Смолкин) #14

Добавил небольшой апдейт, если интересно.


(Sergey Korol) #15

Интересно! 2 момента:

  • Пробовали ли вы вводить кириллицей в обычный инпут? Все же я склонен полагать, что проблема в DevExpress, а не в sendKeys. Посему, чтобы отбросить догадки, интересно увидеть сравнительный пример.
  • Если не сложно, залейте пример в наш местный GitHub, чтобы у других всегда был под рукой code snippet для решения данной проблемы.

(Павел Смолкин) #16

Да, проблема в работе SendKeys конкретно с реализацией "как у DevExpress"
< input ........ onchange="blalblabla('Arg')" .........>< /input >

Испытывал тоже самое на широко любимом инпуте поиска Гугла, яндекса и т.п. Там все тип-топ.