Почему всплывающий календарь не переходит в следующий месяц (python, selenium)?

python #selenium

#python #селен

Вопрос:

Я написал простой код ниже, чтобы открыть календарь резервирования и перейти к следующему месяцу, но календарь, похоже, не переключается на следующий месяц. Есть ли что-то вопиющее, чего мне не хватает?

 driver.get("https://www.tablecheck.com/shops/peterluger/reserve")
driver.maximize_window() 

driver.find_element_by_id("reservation_start_date").click()
driver.find_element(By.XPATH, "//div[@aria-label='Next Month']").click()
 

Ответ №1:

Прежде чем щелкнуть элемент, попробуйте сначала перейти к цели.

Узнайте о ActionChains :

 driver.get("https://www.tablecheck.com/shops/peterluger/reserve")
driver.maximize_window() 

driver.find_element_by_id("reservation_start_date").click()

element = driver.find_element(By.XPATH, "//div[@aria-label='Next Month']")
action = ActionChains(driver)
action.move_to_element(element).click(element).perform()
 

Следующий импорт:

 from selenium.webdriver import ActionChains
 

Комментарии:

1. Почему? Нет необходимости нажимать на сам календарь. Зачем иметь много сложностей и шансов на отказ, имея еще один локатор //div[@aria-label='Next Month'] ?

2. @cruisepandey Ваш ответ соответствует непосредственно целевой дате, и это хорошее и простое исполнение. Но этот ответ пытается предоставить другое решение для OP, Why does the pop-up calendar not click.... поскольку .click() метод не работает.

3. @frianH спасибо тебе! сработало как по волшебству

Ответ №2:

Внешний HTML

 <input class="form-control mobidate i-txt refresh-menu-items mbsc-comp" readonly="" placeholder="-- Select Date --" type="text" name="reservation[start_date]" id="reservation_start_date" value="2021-10-13">
 

показывает, что он имеет атрибут value в форме 2021-10-13 .

Нам не нужно нажимать на это input field и затем select a value from the calendar .

Вместо этого мы можем напрямую pass the value attribute использовать execute script привязки в Python-Selenium.

 driver = webdriver.Chrome(driver_path)
driver.maximize_window()
wait = WebDriverWait(driver, 30)

driver.get("https://www.tablecheck.com/shops/peterluger/reserve")
date = wait.until(EC.visibility_of_element_located((By.ID, "reservation_start_date")))
driver.execute_script("arguments[0].scrollIntoView(true);", date)
driver.execute_script("arguments[0].setAttribute('value', '2021-10-13')", date)
 

Импорт :

 from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
 

Комментарии:

1. большое вам спасибо! хотя это была не та проблема, которую я решал, это было что-то еще, с чем я боролся, и это было так ценно. И да, этот способ намного проще.

2. когда я применяю этот код, поле заполняется указанной датой, но не похоже, что значение распознается на странице (т. Е. Поле по-прежнему остается красным, а не серым). Требуется ли дополнительная строка кода для «активации» установленного значения?

3. Если вы можете что-то сделать без взаимодействия с элементами пользовательского интерфейса в автоматизации. Вы всегда должны выбирать это. Вам действительно не нужно нажимать на средство выбора даты, просто используйте javascript для передачи значения.