我可以使用它,
driver.execute_script('$( "a.ui-datepicker-next").click()')因为其他所有东西都给了我ElementNotVisibleException,然后我注意到其中涉及到Javascript
<a data-handler="next" data-event="click" title="Próximo>"><span >Próximo></span></a>
我宁愿不使用
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.enpre('ascii', 'ignore')) driver.execute_script('$( "button.ui-datepicker-clear" ).click()') count += 1 driver.close()


