#javascript #java #selenium-webdriver #automated-tests #selenium-chromedriver
#javascript #java #selenium-webdriver #автоматизированные тесты #селен-хромовый преобразователь
Вопрос:
Впервые я сталкиваюсь с проблемой с Select из-за того, что Selnium webdriver не смог запустить onchange на нем.
Код, как обычно:
Select country = new Select(driver().findElement(By.id("address.country")));
country.selectByValue("dk");
При выполнении теста страна выбрана успешно, по крайней мере, в интерфейсе, но когда я нажимаю, чтобы отправить форму, появляется сообщение «Обязательное поле не заполнено», и оно высвечивается при выборе этой страны. Когда я вручную нажимаю, чтобы выбрать страну, тогда это работает.
Я вижу , что в этой выбранной стране есть 3 события blur
, change
и focus
. Поэтому я пытаюсь запустить его с помощью Javascript после выбора страны следующим образом:
js().executeScript("arguments[0].onchange", country);
Но это тоже не помогает. Интерфейсный фреймворк представляет собой Nuxt.js (vju)
Есть мысли? Спасибо
ОБНОВЛЕНО
Попробовал предложение @KonstantinPribluda, как следующий метод проверки, но это тоже не помогает
public Boolean isDropdownChanged(WebElement element) {
WebDriver driver = ((RemoteWebElement)element).getWrappedDriver();
return (Boolean) ((JavascriptExecutor)driver).executeScript(""
"var target = document.evaluate("//*[@id='address.country']", document.body, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null).iterateNext(); "
" if(!target.disabled) { "
"target.click(); "
"return true; "
"} "
"return false;"
, element);
}
Комментарии:
1. Ну, похоже, что есть какая-то проверка формы, которая не выполняется. Возможно, событие не было распространено должным образом? Некоторые фреймворки имеют странные обработчики событий. У меня было много проблем с JSF, и полное делегирование JS в браузер обычно делало свое дело: target = document.evaluate(«нравится ли вам какой-либо селектор xpath», document.body, null, XPathResult. UNORDERED_NODE_ITERATOR_TYPE, null). iterateNext(); if(!target.disabled) { target.click(); возвращает true }
2. @KonstantinPribluda: спасибо за ваше предложение. Я преобразовал ваш трюк в метод Java, но это не помогает. Я не могу опубликовать свой код в комментарии, поэтому я обновил свой вопрос.
3. Я согласен с @KonstantinPribluda. В некоторых интерфейсных фреймворках
select
выпадающий список используется только для целей отображения. Фактическая функциональность построена поверхselect
тега как «фасад». Этот фасад — это то, что фактически обрабатывает запуск событий, связанных сselect
выпадающим списком. Когда вы нажимаете наselect
тег, отслеживайте DOM (родительский контейнер, нижний колонтитул страницы и т. Д.) На Предмет любых новых добавлений элементов HTML, которые выступают в качестве фасада дляselect
выпадающего списка. Если да, то вы должны вызватьselect
, а затемclick
или выполнить выбор, связанный с опцией, для элемента фасада.4. @Ragnarsson Я бы сначала отладил javscript в инструментах браузера, чтобы быть уверенным — я разработал его для нашего приложения JSF, у которого много причуд (и недавнее обновление сделало его почти непроверяемым — потому что щелчок обрабатывался прозрачным наложением поверх выпадающего списка) — что вы используете во внешнем интерфейсе?
5. @KonstantinPribluda, это новый проект, и мы используем Nuxt.js (vju)