如何处理日期选择器

时间:2018-03-15 13:58:07

标签: selenium selenium-webdriver

我要选择用户指定的日期,而选择器的代码段在下面。

enter image description here

sendkeys()功能无效,所以我尝试了以下代码。

JavascriptExecutor check = (JavascriptExecutor)driver; check.executeScript("document.getElementById('hotel-checkin').setAttribute('value','10 Jan 2018')");

在输入值时,日期选择器保持活动状态,其中脚本无法单击实际上与日期选择器重叠的搜索按钮。

任何线索都会有很大的帮助。提前谢谢!

1 个答案:

答案 0 :(得分:0)

好的,你要求提供线索,所以这里有一些想法和猜测(只要你没有给我们提供url和html)。

  1. sendkeys()不起作用,因为输入字段很可能附加了一个打开datepicker小部件的事件处理程序。所以,你第一次尝试通过JS设置值是可以的。我使用略有不同的方式(对不起,这里是python代码):driver.execute_script("arguments[0].value = arguments[1];", webelement, value)
  2. 但是这可能无法正常工作,因为您正在向可见字段输入值,并且页面使用的实际字段(应该由datepicker小部件填充)(表单或JS代码)是隐藏,没有价值。然后,尝试找到该字段并通​​过JS方法为其输入值。
  3. 在我目前的项目中,我无法找到隐藏的领域。我决定使用datepicker小部件实现完全类似用户的交互。方案:单击日期字段(打开datepicker小部件),单击年或月选择器按钮,然后单击所需的日期。这种方式小部件在相关领域(无论何时何地)设置相关数据并关闭 为什么我说字段(复数)?我最近的想法是:可能设置可见日期字段是正确的,但还有一些必须设置的其他字段(例如,date_was_set =" true")。
  4. 希望,这很有帮助。

    编辑。至于第3段。这是我有点编辑的例子(python,再次)。

    datepicker看起来像这样 datepicker widget正如您所看到的,它有按钮来调整月份和年份。

    from selenium.webdriver.support import expected_conditions as EC
    
    class SetValCalendarStrategy(object):
        def __init__(self, driver, calendar_param):
            self.driver = driver
            # this object holds parameters to find the calendar itself and its components
            # pairs: 
            #   sel_type - selector type ('xpath', 'id', 'name' etc.)
            #   sel_value - selector value to find ("//tr/td" etc)
            self.param = calendar_param
    
        def __call__(self, field, value, timeout):
            """
            :param <webelement> field - input field
            :param <datetime> value - value (date) to set
            """
            # initiate datepicker with click on date input field
            field.click()
            # wait for a widget to show
            cal = WebDriverWait(self.driver, timeout, 0.3).until(
                    EC.visibility_of_element_located(
                        (self.param.sel_type, self.param.sel_value)))
            # decrease month/year button
            prev_button = cal.find_element(
                    self.param.prev_month.sel_type,
                    self.param.prev_month.sel_value)
            # increase button
            next_button = cal.find_element(
                    self.param.next_month.sel_type,
                    self.param.next_month.sel_value)
            today = datetime.now()
            # calculate difference in months between today and the target date
            month_diff = value.month + (value.year - today.year) * 12 - today.month
            # select month/date
            if month_diff < 0:
                button = prev_button
            else:
                button = next_button
            for i in range(abs(month_diff)):
                button.click()
    
            # template looks like this. It selects only days from target month (bold font)
            # "//div[contains(@class, 'datePickerDay') and not(contains(@class, 'datePickerDayIsFiller')) and text()='{}']"
            # insert day (21) into template. then it becomes
            # "//div[contains(@class, 'datePickerDay') and not(contains(@class, 'datePickerDayIsFiller')) and text()='21']"
            day_picker_sel_value = 
                    self.param.day_picker.sel_template.format(value.day)
            day = cal.find_element(
                    self.param.day_picker.sel_type,
                    day_picker_sel_value)
            day.click()