Как правильно заполненять инпут датой с появляющимся дейтпикером

Суть проблемы:
— есть инпут для заполнения даты
— при вводе (через send_keys) даты в поле появляется datepicker
— когда дейтпикер появляется, то он начинает закрываться кнопку, на которую, после заполнения даты, необходимо нажать

Из описанного выше:

  1. соответственно, через send_keys получаю проблему, что появившейся дейтпикер закрывается кнопку и тест фейлится.
  2. Выбрать “любую” дату из появившегося дейтпикера так же не могу, т.к. выбираемая дата должна изменяться каждый день: минимум — текущий день+4, максимум — текущий день+8.
  3. Кликать по “рандомному” элементу на странице, чтобы закрыть дейтпикер, опять же не хочется, т.к., мне кажется, это не совсем правильно.

Нашел такую статью ...как в Selenium выбрать дату в jQuery Datepicker? • А хотите, я расскажу вам... но моих скудных познаний не хватает, чтобы попробовать воспроизвести это на python.

Буду рад любым советам.

Попробуйте после ввода даты через send_key и перед нажатием кнопки, послать ещё Esc (escape) key. Это должно закрыть datepicker.

А в чём трудность повторения того, что написано в статья на питоне? Непонятен приведённый код или что происходит?

`public void SetDatepicker(IWebDriver driver, string cssSelector, string date)
{
new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(d => driver.FindElement(By.CssSelector(cssSelector)).Displayed);

(driver as IJavaScriptExecutor).ExecuteScript(
String.Format("$(’{0}’).datepicker(‘setDate’, ‘{1}’)", cssSelector, date));
}`

в этом методе в первой строке ожидается появление дейтпикера, а во второй - драйвер кастится до JavaScriptExecutor и віполняется джаваскрипт “$(’{0}’).datepicker(‘setDate’, ‘{1}’)” где на место {0} подставляется селектор дейтпикера, а на место {1} дата которую надо ввести.

Уверен что в Ваших силах сделать такое на питоне :wink:

Нажатие Esc не помогает, т.к. это действие очищает инпут.
Нажатие Enter срабатывает локально в FF, но на сервере, почему-то, не работает :frowning:

Маленькое уточнение.
Вы ESC посылаете через контрол или драйвер? datepicker.send_key или driver.send_key?
Если посылали через контрол, попробуйте через драйвер.

И ещё вопрос: когда Вы проделываете действия вручную, то при нажатии Esc дайтпикер закрывается или поле очищается?

Из всей той статьи вас должна интересовать лишь 1 строка:

ExecuteScript("$('cssSelector').datepicker('setDate', 'date')");

Идея закючается в том, чтобы вместо стандартных селениумовских средств по типу sendKeys использовать нативные datepicker API через JavascriptExecutor. WebDriver, он и в Python - WebDriver. Вызывать js executor умеете? Вот и передайте ему селектор с датой.

В случае чистого драйвера, снять фокус можно JS командой blur на рутовом компоненте datepicker’а.

4 Likes

Может вам еще такое поможет чем-то, полезно почитать, если будете дейтпикер ковырять: :slight_smile:

Спасибо за ссылки, но я решил воспользоваться советом ArtOfLife Заполнением инпута дейтпикера через js, мне кажется более простым способом.