На странице есть некий <input type="date">
. При клике на него - открывается нативный календарь браузера. В Chrome это выглядит вот так: Monosnap
Задача - средствами Selenium установить туда значение. Как это можно сделать?
Календарь, который приведен на скрине никак не проявляется в коде страницы, поэтому найти какие-то его элементы и манипулировать ими не получается.
Я пробовал отправить в данное поле send_keys:
date = "20-02-2018"
date_field = driver.find_element(some_locator)
date_field.send_keys(date)
Причем приведенный в примере кода формат date соответствует тому, как эти поля у меня отображаются в Chrome. Но я так же перепробовал кучу других форматов для date (в т.ч. “yyyy-mm-dd”, “yyyymmdd” и многие другие.)
При выполнении этого кода в поле устанавливается дата, НО она каждый раз разная и можно сказать случайная. Причем даже если на вход подавались одни и те же данные - результат из раза в раз отличается. То станет что-то типа “20-01-0005”, то “01-02-2019” и т.п. Эпизодически проскакивают удачные разы, когда выставляется именно та дата, которую передавал, но это крайне редко.
После этого я пробовал установить дату средствами JavaScript:
driver.execute_script("arguments[0].value='2018-02-20'; ", date_field)
И дата корректно выставляется.
НО, в моем приложении, когда устанавливается дата в это поле - она некоторым образом валидируется и всплывает некое сообщение.
Когда же я выставляю дату через JavaScript - валидация не происходит.
Это приложение сделано на React. И в реакте на это поле висит обработчик на событие Change (со слов разработчика, сам то я в этом увы не силен). Этот обработчик и делает нужную мне валидацию.
Тогда я попробовал сгенерировать событие change:
driver.execute_script("arguments[0].value='2018-02-20'; arguments[0].dispatchEvent(new Event('change')) ", date_field)
Пробовал так же с new Event(‘change’, {bubbles: true, cancelable: false});
И на событие ‘input’ пробовал.
Но результат один - никакого. Значение меняется JavaScript -ом, но валидации не происходит. Реакт не видит моих изменений. И если я начинаю делать другие дальнейшие действия на странице (заполнять другие поля, с которыми все проще), то значение в моем поле даты перескакивает на исходное, которое было до моих изменений.
Буду очень благодарен за помощь в этом вопросе!
P.S. Windows 10, Selenium 3.9.0, Chrome 63, Chromedriver 2.35