当前位置: 首页 > 面试题库 >

Python Selenium + Datepicker请点击

严劲
2023-03-14
问题内容

我一直在努力尝试获取此类房间的价格,例如,通过单击第一个可用的(绿色)datepicker签入输入,然后单击第一个可用的datepicker签入输入,以便生成最短期间的价格。

我的代码很乱,所以如果有人可以发布更简洁的代码来实现这一目标,我将不胜感激。

我正在使用Python selenium + scrapy,尽管以Java为例仍然有用。

更新:

这是代码:

def availability(self, doc):
    url = doc['url'] + '#calendar'
    self.driver.get(url)
    is_active = True
    # We want to the availability/price for each day in a month.
    availabilities = []

    # wait for the check in input to load
    wait = WebDriverWait(self.driver, 10)

    try:
        elem = wait.until(
            EC.visibility_of_element_located(
                (By.CSS_SELECTOR, ".dates-group input[name=startDateInput]")
            )
        )
    except TimeoutException:
        pass
    else:
        elem.click()  # open calendar
        # wait for datepicker to load
        wait.until(
            EC.visibility_of_element_located(
                (By.CSS_SELECTOR, '.ui-datepicker:not(.loading)'))
        )
        days = self.driver.find_elements_by_css_selector(
            "#ui-datepicker-div tr td"
        )

        for cell in days:
            day = cell.text.strip()
            if not day:
                continue

            if "full-changeover" not in cell.get_attribute("class"):
                available = False
            else:
                available = True

            self.logger.warning('CELL "%s"', cell)
            self.logger.warning('DAY "%s"', day)
            self.logger.warning('available "%s"', available)


        # The first iteration was to list the availability, now we want to
        # click the first available element to get the price
        for cell in days:
            day = cell.text.strip()
            if not day:
                continue

            if "full-changeover" in cell.get_attribute("class"):
                self.logger.warning('CLICK IT "%s"', day)
                self.driver.implicitly_wait(10)
                x = self.driver.find_element_by_xpath("//table/tbody/tr/td/a[text()=" + day + "]")
                self.driver.implicitly_wait(10)
                x.click() # Element not found in the cache issue here
                # import ipdb; ipdb.set_trace()

            # self.logger.warning('CELL "%s"', cell)
            # self.logger.warning('DAY "%s"', day)
            # self.logger.warning('available "%s"', available)

        # elem.click()  # close checkin calendar

        # Now lets click on the checkout input to get the price and minimum
        # number of days. We probably don't have to wait for the checkout
        # because its already loaded but you never know.

        try:
            elem = wait.until(
                EC.visibility_of_element_located(
                    (By.CSS_SELECTOR,
                     ".dates-group input[name=endDateInput]")
                )
            )
        except TimeoutException:
            pass
        else:
            # elem.click()  # open calendar in checkout input
            # wait for datepicker to load
            wait.until(
                EC.visibility_of_element_located(
                    (By.CSS_SELECTOR, '.ui-datepicker:not(.loading)'))
            )
            days = self.driver.find_elements_by_css_selector(
                "#ui-datepicker-div tr td"
            )

            for cell in days:
                day = cell.text.strip()
                if not day:
                    continue

                # This is the first available date to checkout
                if "full-changeover" in cell.get_attribute("class"):
                    self.logger.warning('CLICK IT "%s"', available)
                    import ipdb; ipdb.set_trace()
                    # Here we would get the generated price



                self.logger.warning('CELL "%s"', cell)
                self.logger.warning('DAY "%s"', day)
                self.logger.warning('available "%s"', available)




        import ipdb; ipdb.set_trace()

    return {'availabilities': availabilities, 'is_active': is_active}

谢谢


问题答案:

关于此html" target="_blank">日历的一件棘手的事情是,您首先需要将鼠标悬停在特定的日期,然后重新定位活动的日期并单击它。这是一个有效的实现方式,它选择第一个可用的开始和结束日期并打印计算出的价格:

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


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)

driver.close()

目前,它选择20/04/201623/04/2016并打印180€

希望能有所帮助。



 类似资料:
  • 问题内容: 我用python与selenium结合编写了一个脚本,以从其着陆页中抓取不同文章的链接,并通过跟踪引向其内页的url最终获得每个文章的标题。尽管我在这里解析的内容是静态内容,但我还是使用了selenium来查看它在多处理中的工作方式。 但是,我的意图是使用多处理进行抓取。到目前为止,我知道selenium不支持多处理,但似乎我错了。 我的问题:当使用多处理运行selenium时,如何减

  • jQueryUI中的Datepickers允许用户轻松,直观地输入日期。 您可以自定义日期格式和语言,限制可选日期范围,并轻松添加按钮和其他导航选项。 jQueryUI提供了datepicker datepicker()方法,该方法通过添加新的CSS类来创建日期选择器并更改页面上HTML元素的外观。 将包装集中的“input”,“div”和“span”元素转换为datepicker控件。 默认情况

  • 问题内容: 我创建了一个小的屏幕抓取器,并且一切似乎都运行良好,信息被提取并保存在数据库中。我唯一遇到的问题是有时Python不使用,因此它尝试在错误的页面上获取信息并崩溃。我尝试添加一个,但有时仍然无法正常工作。我正在尝试对其进行优化,以尽可能减少时间。因此,使其hibernate30秒似乎不是一个好的解决方案。 问题答案: 这是最好的解决方案。不能保证back()和forward()方法有效。

  • 问题内容: 我一直在努力找出我的代码发生了什么,但我无能为力。每当我运行程序时,都会在以下图片中出现此错误。我正在使用python 3.4.4和它的selenium最新版本。 Windows 10 错误图片 问题答案: 您没有提到您的FF版本是什么,我认为它是最新的。无论如何,您都需要使用低于47的FF或有时间切换到MarionetteDriver 这是一些有用的信息Selenium 2.53在F

  • 描述 (Description) Widget DatePicker函数可以与JqueryUI中的小部件一起使用。 它侧重于以小叠加层打开交互式日历的输入。 语法 (Syntax) 以下是使用DatePicker的简单语法 - $( "#datepicker" ).datepicker(); 例子 (Example) 以下是一个显示DatePicker用法的简单示例 - <!doctype ht

  • md-datepicker是一个Angular Directive,是一个输入控件,用于选择日期并支持ngMessages进行输入验证。 属性 (Attributes) 下表列出了md-datepicker的不同属性的参数和描述。 Sr.No 参数和描述 1 * ng-model 该组件的模型需要一个JavaScript Date对象。 2 ng-change 模型值更改时计算的表达式。 3 md