Selenium не может запустить onchange в раскрывающемся списке выбора

#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)