从日期选择器获取可用性 [英] Getting availability from datepicker

查看:23
本文介绍了从日期选择器获取可用性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图通过单击日期选择器日历中的下一个按钮来获取 homeaway 中每一天的价格,但没有成功.

i am trying to get the price for each day in homeaway by clicking the next button in the datepicker calendar but with no luck.

我当前的代码类似于:

def handle(self, *args, **options):
    def homeaway(self):
        display = Display(visible=0, size=(1024, 768))
        display.start()
        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.encode('ascii', 'ignore'))

        driver.close()

他们都可以工作,但只能工作 1 个月.我希望能够设置 X 个月.例如,对于 homeaway,我在第一次打开日历点击后立即尝试使用 self.driver.find_element_by_css_selector('.ui-datepicker-next.ui-corner-all').c‌ lick() 但我得到一个 ElementNotVisibleException

They both work but only for 1 month. I want to be able to set X months instead. For example for homeaway i tried with self.driver.find_element_by_css_selector('.ui-datepicker-next.ui-corner-all').c‌​lick() right after the first open calendar click but i got a ElementNotVisibleException

提前致谢

推荐答案

我能够使用 driver.execute_script('$( "a.ui-datepicker-next" ).click()') 因为其他一切都给了我 ElementNotVisibleException 然后我注意到有 javascript 参与

I was able to get this working using driver.execute_script('$( "a.ui-datepicker-next" ).click()') since everything else was giving me ElementNotVisibleException and then i noticed that there was javascript involved

<a class="ui-datepicker-next ui-corner-all" data-handler="next" data-event="click" title="Próximo>"><span class="ui-icon ui-icon-circle-triangle-e">Próximo&gt;</span></a>

我宁愿不直接使用 JavascriptjQuery,所以如果有人有更好的建议,我可以尝试.

I would rather not use Javascript or jQuery directly so if anyone has better suggestions i can try them.

但是仍然有一些怪癖,例如我每次获得某个月份的可用性时都必须手动重置日历.

But there are still a few quirks, for example i have to manually reset the calendar each time i get the availability for a certain month.

这是我的最终代码:

def homeaway(self):
    MONTH_COUNT = 6
    display = Display(visible=0, size=(1024, 768))
    display.start()
    driver = webdriver.Firefox()
    driver.maximize_window()

    wait = WebDriverWait(driver, 10)

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

    count = 0
    for month in range(MONTH_COUNT):
        # pick start date
        start_date = wait.until(EC.visibility_of_element_located((
            By.CSS_SELECTOR,
            ".quotebar-container input[name=startDateInput]")))
        start_date.click()

        for x in range(count):
            driver.execute_script('$( "a.ui-datepicker-next" ).click()')

        current_month = driver.find_element_by_css_selector(
            ".ui-datepicker-month").text

        print("current_month:", current_month)

        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.encode('ascii', 'ignore'))

        driver.execute_script('$( "button.ui-datepicker-clear" ).click()')

        count += 1

    driver.close()

这篇关于从日期选择器获取可用性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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