簡體   English   中英

如何使用 Selenium ZA7F5F352326B9278417369 在 Booking.com 日歷上 select 出發和返回日期

[英]How to select departure and return date on the calendar of Booking.com by using Selenium Python?

I'm building a web scraper using Selenium Python on Booking.com and I am stuck with calendar select dates. 下面是我的 function 代碼。 我正在使用 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:\Users\osama\Anaconda3", 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 的方法,然后使用固定日期的循環或 while 循環編寫一個 for 循環。 在下面的代碼中,我只是 select 日歷上的下一個按鈕,我可以根據我要選擇的日期輕松自定義多次單擊它,然后 select 分別簽入日期和簽出日期,瞧,它起作用了,我知道不是最好的解決方案,因為我仍然是初學者,但它滿足了我對廢料的需求。 請善待並查看我的解決方案並給我您的反饋我將上面代碼中的 function 更改為下面的代碼。

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM