2017-03-31 5 views
5

Ich versuche die Verfügbarkeit/Preis für jeden Tag in https://www.homeaway.pt/arrendamento-ferias/p418841 zu erhalten, indem ich auf den Kalender klicke, welche Tage besetzt sind oder nicht, klicke auf die next Taste, damit es zum nächsten Monat springen kann.Python Selenium + Datepicker Ausgaben

Ich möchte auch auf das Ankunftsdatum klicken und dann ein Abreisedatum auswählen, so dass ich den Preis dafür sehen kann.

Ich stoße auf Probleme, weil ich Befehle ausprobiere, die in Chrom funktionieren, aber dann scheinen sie in Selen nicht zu funktionieren.

Zum Beispiel:

ich tun:

 self.driver.get(url) 
     wait = WebDriverWait(self.driver, 10) 
     try: 
      elem = wait.until(
       EC.visibility_of_element_located(
        (
         By.CSS_SELECTOR, 
         "#startDateInput" 
        ) 
       ) 
      ) 
     except TimeoutException: 
      pass 
     else: 
      elem.send_keys(Keys.NULL) 

Dies scheint den Kalender zu öffnen, und ich kann auch die auswählbaren Tage Liste mit:

for x in self.driver.find_elements_by_css_selector(".stab-calendar-day.stab-calendar-day-active.stab-calendar-day-selectable.pull-left"): print(x.get_attribute('data-formatted-date')) 

Aber dann, wenn ich will um zum nächsten aktiven Monat zu springen, zeigt es den gleichen Anfangsmonat an, und zwar weil das nicht funktioniert:

self.driver.find_element_by_css_selector('.stab-calendar-controls-next').click() 

selenium.common.exceptions.NoSuchElementException: Meldung: Kann nicht Element lokalisieren: { "Methode": "CSS-Selektor", "Selektor": "STAB-Kalender-controls-next"}

Irgendwelche Ideen, wie ich die Verfügbarkeit/Preis des Hauses für jeden Satz von ausgewählten Tagen bekommen kann?

+0

Ich habe keine Python, aber ich schrieb etwas Code in Java und ich finde wirklich keine Probleme. Ich verwende einen anderen CSS-Selektor, um die verfügbaren Daten zu erhalten, '" div.stab-calendar-day-selectierbar: nicht (.stab-calendar-day-disabled) "'. Sie benötigen dies, um die Daten, die am Ende und am Anfang des Monats liegen, als Platzhalter zu kennzeichnen, aber nicht anklickbar sind, oder Sie werden feststellen, dass Sie Wiederholungsdaten erhalten. Wenn ich die nächste Schaltfläche mit "a.stab-calendar-controls-next" finde und anklicke, funktioniert das für mich. Es kann ein Timing-Problem sein, haben Sie versucht, vor dem nächsten Klick zu warten? – JeffC

+0

Können Sie Ihren Java-Code posten, damit ich ihn sehen und ausprobieren kann? Ich habe versucht, ohne Glück zu warten – psychok7

+0

Sie Code funktioniert gut in Chrome und Python, solange das Kalender-Popup immer noch angezeigt wird. Ich schneide und klebte ohne Fehler. Überprüfen Sie die Version von Selen? Kannst du es mit einem anderen Treiber versuchen (Firefox, etc.)? – pbuck

Antwort

0

Ich bin mir nicht sicher, was genau Sie erreichen wollen, aber wenn Sie ein Problem haben, können Sie nicht auf den nächsten Knopf klicken. Die Lösung ist einfach. Bitte ändere den Selektor, um auf das Kindelement zu klicken und es wird funktionieren. Ich habe es getestet und es funktioniert auf Firefox.

driver.find_element_by_css_selector(".stab-calendar-controls-next > i").click() 

Und folgende ist der ganze Code, der funktioniert. zum ersten Mal wird es die Daten von aktuellen und nächsten drucken. und dann die nächsten zwei Monate.

driver = webdriver.Firefox() 
driver.get("https://www.homeaway.pt/arrendamento-ferias/p418841") 
wait = WebDriverWait(driver, 10) 
try: 
    elem = wait.until(
     EC.visibility_of_element_located(
      (
       By.CSS_SELECTOR, 
       "#startDateInput" 
      ) 
     ) 
    ) 
except TimeoutException: 
    pass 
else: 
    elem.send_keys(Keys.NULL) 

for x in driver.find_elements_by_css_selector(".stab-calendar-day.stab-calendar-day-active.stab-calendar-day-selectable.pull-left"): 
    print(x.get_attribute('data-formatted-date')) 
# driver.find_element_by_xpath("//*[@class='stab-calendar-controls-next']/i").click() 
driver.find_element_by_css_selector(".stab-calendar-controls-next > i").click() 
for x in driver.find_elements_by_css_selector(".stab-calendar-day.stab-calendar-day-active.stab-calendar-day-selectable.pull-left"): 
    print(x.get_attribute('data-formatted-date'))