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 для передачи значения.