如何使用Selenium Python在Booking.com的日历上选择出发和返回日期



我正在Booking.com上使用Selenium Python构建一个web scraper,但我被日历选择日期所困扰。下面是我的函数代码。我正在使用一个run.py和另一个外部函数文件。日期选择不起作用我可以从同一个月选择两天,但从两个不同的月不起作用

import Booking.constants as const
from selenium import webdriver
from selenium.webdriver.common.by import  By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import os
class Booking(webdriver.Chrome):
def __init__(self, driver_path=r"C:UsersosamaAnaconda3", teardown=False) :
self.driver_path = driver_path
self.teardown = teardown
os.environ['PATH'] += self.driver_path
super(Booking, self).__init__()
self.implicitly_wait(15)
self.maximize_window()

def __exit__(self, exc_type, exc, traceback):
if self.teardown:
self.quit()

def land_first_page(self):
self.get(const.BASE_URL) 

def choose_currency(self, currency=None):
currency_element = self.find_element(By.CSS_SELECTOR, 
'button[data-modal-header-async-type="currencyDesktop"]'
)
currency_element.click()
selected_currency = self.find_element(By.CSS_SELECTOR, 
f'a[data-modal-header-async-url-param="changed_currency=1&selected_currency={currency}"]'
)
selected_currency.click()

def select_place_to_go(self, place_to_go):
search_field = self.find_element(By.ID, 'ss')
search_field.clear()
search_field.send_keys(place_to_go)
first_result = self.find_element(By.CSS_SELECTOR, 'li[data-i="0"').click()

def select_dates(self, check_in_date, check_out_date):
check_in_element = self.find_element(By.CSS_SELECTOR, f'td[data-date="{check_in_date}"]').click()
time.sleep(4)
all_dates = self.find_elements(By.XPATH, "//div[@class='bui-calendar']//tbody//td")
for date in all_dates:
if date.get_attribute("data-date") == f'{check_out_date}':
date.click()
time.sleep(4)
break

我想我找到了一个部分有效的答案。我找到的所有问题的答案都是用Java编写的,而python中唯一的答案是选择整个日历的XPath,然后编写一个带有固定日期的for循环或while循环。在下面的代码中,我只需选择日历上的下一个按钮,我可以根据我想要选择的日期轻松地多次自定义单击它,然后分别选择入住日期和退房日期,瞧,它奏效了。我知道这不是最好的解决方案,因为我还是一个初学者,但它满足了我的需求。请好心看看我的解决方案,并给我你的反馈。我用下面的代码更改了上面代码中的函数。

def select_dates(self, check_in_date, check_out_date):
next_button = self.find_element(By.XPATH, '//div[@data-bui-ref="calendar-next"]')
next_button.click()
check_in_element = self.find_element(By.CSS_SELECTOR, f'td[data-date="{check_in_date}"]')
check_in_element.click()
check_out_element = self.find_element(By.CSS_SELECTOR, f'td[data-date="{check_out_date}"]')
check_out_element.click()

最新更新