【问题标题】:Getting availability from datepicker从日期选择器获取可用性
【发布时间】:2016-05-04 14:04:20
【问题描述】:

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

我当前的代码是这样的:

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

提前致谢

【问题讨论】:

    标签: python selenium datepicker


    【解决方案1】:

    要在日期选择器已打开时单击“下个月”按钮,请尝试以下操作:

    def click_next_month(self):
        elements = self.driver.find_element_by_xpath('//span[@class="ui-icon ui-icon-circle-triangle-e"]')
        elements[1].click()
    

    要多次单击“下个月”按钮,您需要每次重新定义elements,因此最好将这两个操作(定义列表和按钮单击)实现为方法click_next_month()

    如果出现任何问题,请尝试告诉我

    【讨论】:

    • 嗨,我仍然收到带有您的代码的ElementNotVisibleException :(
    【解决方案2】:

    我能够使用 driver.execute_script('$( "a.ui-datepicker-next" ).click()') 来完成这项工作,因为其他所有东西都给了我 ElementNotVisibleException 然后我注意到其中涉及到 javascript

    <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,所以如果有人有更好的建议,我可以试试。

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

    这是我的最终代码:

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

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多