2016-05-04 2 views
1

Я пытаюсь получить цену за каждый день в доме, щелкнув следующую кнопку в календаре даты, но не повезло.Получение доступности от datepicker

Мой текущий код-то вроде:

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

Заранее спасибо

ответ

1

я смог получить эту работу, используя 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> 

I скорее не будет использовать Javascript или jQuery, поэтому, если у кого-то есть лучшие предложения, я могу попробовать их.

Но есть еще несколько причуд, например, я должен вручную сбросить календарь каждый раз, когда я получу доступность в течение определенного месяца.

вот мой окончательный код:

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

нажать на кнопку «Следующий месяц» кнопка, когда DatePicker уже открыт попробовать следующее:

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

Try и дайте мне знать, если какие-либо вопросы, происходит

+0

я постараюсь позже и пусть вы знаете, спасибо – psychok7

+0

привет, я все еще получаю 'ElementNotVisibleException' с кодом :( – psychok7

Смежные вопросы