Вопрос или проблема
Может кто-нибудь подсказать, как выбрать диапазон дат в виджете выбора даты на expedia.com с помощью selenium python?
Например: Перейдите на expedia/ flights
нажмите на Даты и выберите текущий день до следующих 7 дней.
driver = webdriver.Chrome()
ac = ActionChains(driver)
driver.implicitly_wait(10)
driver.get("https://www.expedia.com/Flights")
dates_btn = driver.find_element(By.XPATH,'//\*\[@id="FlightSearchForm_ROUND_TRIP"\]/div/div\[2\]')
ac.click(dates_btn).perform()
calendar = driver.find_element(By.XPATH,'//\*\[@id="FlightSearchForm_ROUND_TRIP"\]/div/div\[2\]/div/section')
ac.move_to_element(calendar).perform()
Я пытался протестировать выбор месяца и года в правом верхнем углу календаря, но столкнулся с ошибкой, не удается найти элемент.
right_month_year = driver.find_element(By.XPATH,'//\*\[@id="FlightSearchForm_ROUND_TRIP"\]/div/div\[2\]/div/div/div/div\[2\]/div/div\[1\]/div\[2\]/div\[2\]/h2')
print(month_year.text)
Вот рабочий код с пояснением каждой строки:
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://www.expedia.com/Flights")
driver.maximize_window()
wait = WebDriverWait(driver, 10)
# Нажмите на кнопку выбора даты
wait.until(EC.element_to_be_clickable((By.ID, "date_form_field-btn"))).click()
# По умолчанию календарь открывается на следующий месяц (ноябрь). Следующая строка нажимает кнопку назад, чтобы вернуться в октябрь
wait.until(EC.element_to_be_clickable((By.XPATH, "(//button[@data-stid='date-picker-paging'])[1]"))).click()
# Нажмите на 23 октября. Измените XPath, если хотите выбрать другой день
wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(@aria-label,'Oct 23, 2024')]"))).click()
# Нажмите на 30 октября. Измените XPath, если хотите выбрать другой день
wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(@aria-label,'Oct 30, 2024')]"))).click()
# Нажмите кнопку 'Готово'
wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@data-stid='apply-date-picker']"))).click()
time.sleep(20)
Результат:
Ответ или решение
Решение проблемы выбора дат из выпадающего календаря на сайте expedia.com с использованием Selenium на Python
Ваша задача состоит в том, чтобы выбрать диапазон дат (текущая дата до следующей недели) на сайте expedia.com в разделе "Авиабилеты" с помощью библиотеки Selenium на Python. Ниже вы найдете детальное руководство, включая исправленный код и обоснование каждого шага.
Предварительная настройка
Для начала убедитесь, что у вас установлены все необходимые библиотеки:
pip install selenium
Также убедитесь, что у вас установлен веб-драйвер для вашего браузера (в данном случае Chrome).
Рекомендуемый код
Вот рабочий пример, который позволяет наглядно выбрать нужные даты с помощью Selenium:
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
# Инициализация веб-драйвера
driver = webdriver.Chrome()
driver.get("https://www.expedia.com/Flights")
driver.maximize_window()
# Создание объекта ожидания
wait = WebDriverWait(driver, 10)
# Нажатие на кнопку выбора даты
wait.until(EC.element_to_be_clickable((By.ID, "date_form_field-btn"))).click()
# Переход в предыдущий месяц, если календарь открывается на следующем месяце
wait.until(EC.element_to_be_clickable((By.XPATH, "(//button[@data-stid='date-picker-paging'])[1]"))).click()
# Выбор текущей даты (например, 23 октября 2024 года)
wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(@aria-label,'Oct 23, 2024')]"))).click()
# Выбор даты через 7 дней (например, 30 октября 2024 года)
wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(@aria-label,'Oct 30, 2024')]"))).click()
# Нажатие кнопки 'Готово'
wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@data-stid='apply-date-picker']"))).click()
# Задержка для проверки результата
time.sleep(20)
# Закрытие драйвера
driver.quit()
Объяснение кода
-
Импорт библиотек: Мы импортируем необходимые модули для работы с Selenium.
-
Инициализация драйвера: Создание экземпляра драйвера Chrome и загрузка страницы expedia.com.
-
Максимизация окна браузера: Улучшает видимость и доступность элементов.
-
Ожидание загрузки элементов: Используем
WebDriverWait
для ожидания загрузки интерактивных элементов, что позволяет избежать ошибок "элемент не найден". -
Нажатие на кнопку выбора даты: Мы ожидали, пока кнопка станет доступной, и затем кликнули по ней.
-
Переход к предыдущему месяцу: Если календарь открывается на следующем месяце, мы используем XPath для нажатия на кнопку возврата.
-
Выбор нужных дат: Первая дата выбирается через XPath для кнопки, соответствующей текущей дате, а вторая — для даты, которая наступит через 7 дней.
-
Подтверждение выбора дат: Нажатие кнопки "Готово", чтобы сохранить выбор.
-
Закрытие драйвера: По завершении демонстрации скрипт закрывает браузер.
Заключение
Если вы сталкиваетесь с ошибками при попытке обнаружить элементы, убедитесь, что используемые вами XPath выражения корректны. Вы можете использовать инструменты разработчика вашего браузера для проверки элементов в реальном времени и оптимизации XPath.
Этот подход эффективен для автоматизации выбора дат на сайте Expedia, и его можно адаптировать для других элементов и многопользовательских задач. Надеюсь, это руководство поможет вам успешно выполнить вашу задачу.