Python Selenium + Datepicker 点击 [英] Python Selenium + Datepicker Click

查看:36
本文介绍了Python Selenium + Datepicker 点击的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在绞尽脑汁想知道像 这样的房间的价格 例如,通过单击第一个可用的(绿色)日期选择器签入输入,然后单击第一个可用的日期选择器签出输入,从而生成最小周期的价格.

I have been banging my head around trying to get the price of a room like this for example by clicking the first available (green) datepicker checkin input and then clicking the first available datepicker checkout input so the price for the minium period is generated.

我的代码一团糟,所以如果有人可以发布更清晰的代码来实现这一点,我将不胜感激.

My code is a mess so i would really appreciate if someone could post a cleaner code to achieve that.

我正在使用 Python selenium + scrapy,尽管例如 Java 中的某些东西仍然会有所帮助.

I am using Python selenium + scrapy although something in Java for example would still help.

更新:

代码如下:

def availability(self, doc):
    url = doc['url'] + '#calendar'
    self.driver.get(url)
    is_active = True
    # We want to the availability/price for each day in a month.
    availabilities = []

    # wait for the check in input to load
    wait = WebDriverWait(self.driver, 10)

    try:
        elem = wait.until(
            EC.visibility_of_element_located(
                (By.CSS_SELECTOR, ".dates-group input[name=startDateInput]")
            )
        )
    except TimeoutException:
        pass
    else:
        elem.click()  # open calendar
        # wait for datepicker to load
        wait.until(
            EC.visibility_of_element_located(
                (By.CSS_SELECTOR, '.ui-datepicker:not(.loading)'))
        )
        days = self.driver.find_elements_by_css_selector(
            "#ui-datepicker-div tr td"
        )

        for cell in days:
            day = cell.text.strip()
            if not day:
                continue

            if "full-changeover" not in cell.get_attribute("class"):
                available = False
            else:
                available = True

            self.logger.warning('CELL "%s"', cell)
            self.logger.warning('DAY "%s"', day)
            self.logger.warning('available "%s"', available)


        # The first iteration was to list the availability, now we want to
        # click the first available element to get the price
        for cell in days:
            day = cell.text.strip()
            if not day:
                continue

            if "full-changeover" in cell.get_attribute("class"):
                self.logger.warning('CLICK IT "%s"', day)
                self.driver.implicitly_wait(10)
                x = self.driver.find_element_by_xpath("//table/tbody/tr/td/a[text()=" + day + "]")
                self.driver.implicitly_wait(10)
                x.click() # Element not found in the cache issue here
                # import ipdb; ipdb.set_trace()

            # self.logger.warning('CELL "%s"', cell)
            # self.logger.warning('DAY "%s"', day)
            # self.logger.warning('available "%s"', available)

        # elem.click()  # close checkin calendar

        # Now lets click on the checkout input to get the price and minimum
        # number of days. We probably don't have to wait for the checkout
        # because its already loaded but you never know.

        try:
            elem = wait.until(
                EC.visibility_of_element_located(
                    (By.CSS_SELECTOR,
                     ".dates-group input[name=endDateInput]")
                )
            )
        except TimeoutException:
            pass
        else:
            # elem.click()  # open calendar in checkout input
            # wait for datepicker to load
            wait.until(
                EC.visibility_of_element_located(
                    (By.CSS_SELECTOR, '.ui-datepicker:not(.loading)'))
            )
            days = self.driver.find_elements_by_css_selector(
                "#ui-datepicker-div tr td"
            )

            for cell in days:
                day = cell.text.strip()
                if not day:
                    continue

                # This is the first available date to checkout
                if "full-changeover" in cell.get_attribute("class"):
                    self.logger.warning('CLICK IT "%s"', available)
                    import ipdb; ipdb.set_trace()
                    # Here we would get the generated price



                self.logger.warning('CELL "%s"', cell)
                self.logger.warning('DAY "%s"', day)
                self.logger.warning('available "%s"', available)




        import ipdb; ipdb.set_trace()

    return {'availabilities': availabilities, 'is_active': is_active}

谢谢

推荐答案

此日历的一个棘手之处在于,您首先需要将鼠标悬停在特定日期上,然后重新定位活动日期并单击它.这是一个工作实现,它选择第一个可用的开始和结束日期并打印计算出的价格:

One tricky thing about this calendar is that you first need to hover a particular day and then relocate the active day and click it. Here is a working implementation that selects the first available start and end dates and prints the calculated price:

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Firefox()
driver.maximize_window()

wait = WebDriverWait(driver, 10)

url = 'https://www.homeaway.pt/arrendamento-ferias/p1418427a?uni_id=1590648'
driver.get(url)

# pick start date
start_date = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".quotebar-container input[name=startDateInput]")))
start_date.click()

first_available_date = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#ui-datepicker-div td.full-changeover > a")))
ActionChains(driver).move_to_element(first_available_date).perform()
driver.find_element_by_css_selector("#ui-datepicker-div td.full-selected.full-changeover > a").click()

# pick end date (TODO: violates DRY principle, refactor!)
end_date = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".quotebar-container input[name=endDateInput]")))
end_date.click()

first_available_date = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#ui-datepicker-div td.full-changeover > a")))
ActionChains(driver).move_to_element(first_available_date).perform()
driver.find_element_by_css_selector("#ui-datepicker-div td.full-selected.full-changeover > a").click()

# get the calculated price
price = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".price-quote .price-total")))
print(price.text)

driver.close()

此时,它选择20/04/201623/04/2016并打印180€.

At the moment, it selects 20/04/2016 and 23/04/2016 and prints 180€.

希望有所帮助.

这篇关于Python Selenium + Datepicker 点击的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆