Не удалось найти элемент в выборе даты expedia.com

Вопрос или проблема

Может кто-нибудь подсказать, как выбрать диапазон дат в виджете выбора даты на 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()

Объяснение кода

  1. Импорт библиотек: Мы импортируем необходимые модули для работы с Selenium.

  2. Инициализация драйвера: Создание экземпляра драйвера Chrome и загрузка страницы expedia.com.

  3. Максимизация окна браузера: Улучшает видимость и доступность элементов.

  4. Ожидание загрузки элементов: Используем WebDriverWait для ожидания загрузки интерактивных элементов, что позволяет избежать ошибок "элемент не найден".

  5. Нажатие на кнопку выбора даты: Мы ожидали, пока кнопка станет доступной, и затем кликнули по ней.

  6. Переход к предыдущему месяцу: Если календарь открывается на следующем месяце, мы используем XPath для нажатия на кнопку возврата.

  7. Выбор нужных дат: Первая дата выбирается через XPath для кнопки, соответствующей текущей дате, а вторая — для даты, которая наступит через 7 дней.

  8. Подтверждение выбора дат: Нажатие кнопки "Готово", чтобы сохранить выбор.

  9. Закрытие драйвера: По завершении демонстрации скрипт закрывает браузер.

Заключение

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

Этот подход эффективен для автоматизации выбора дат на сайте Expedia, и его можно адаптировать для других элементов и многопользовательских задач. Надеюсь, это руководство поможет вам успешно выполнить вашу задачу.

Оцените материал
Добавить комментарий

Капча загружается...