2016-05-04 4 views
1

Ich versuche, den Preis für jeden Tag in der Homeaway durch Klicken auf die nächste Schaltfläche im Datepicker Kalender, aber ohne Glück zu bekommen.Verfügbarkeit ab datepicker

Mein aktueller Code ist so etwas wie:

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

beide arbeiten sie aber nur für 1 Monat. Ich möchte stattdessen X Monate festlegen können. Zum Beispiel für Provisions habe ich versucht, mit self.driver.find_element_by_css_selector('.ui-datepicker-next.ui-corner-all').c‌​lick() direkt nach dem ersten offenem Kalender klicken, aber ich habe einen ElementNotVisibleException

Vielen Dank im Voraus

Antwort

1

tritt ich in der Lage war, diese zum Laufen zu bringen mit driver.execute_script('$("a.ui-datepicker-next").click()') da alles andere war mir ElementNotVisibleException geben und dann bemerkte ich, dass es 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 beteiligt würde lieber nicht Javascript oder jQuery direkt verwenden, also wenn jemand bessere Vorschläge hat, kann ich sie versuchen.

Aber es gibt noch ein paar Macken, zum Beispiel muss ich den Kalender jedes Mal manuell zurücksetzen, wenn ich die Verfügbarkeit für einen bestimmten Monat bekomme.

hier ist meine letzte Code:

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

auf „Next Monat“ zu klicken, wenn picker bereits geöffnet versucht folgenden:

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

Um mehrmals auf "Nächster Monat" zu klicken, müssen Sie jedesmal elements neu definieren, daher sollten beide Aktionen (Definition der Liste und Schaltfläche) als Methode click_next_month() implementiert werden.

Versuchen und lassen Sie mich wissen, wenn irgendwelche Probleme

+0

ich werde später versuchen, und lassen Sie wissen, dank – psychok7

+0

Hallo, ich bin immer noch ein 'ElementNotVisibleException' mit Ihrem Code bekommen :( – psychok7