Search code examples
watir

Selecting Date from the Datepicker. How do I do that using WATIR


I don't know how to select the date from the date picker, For an example, If I want to select 1/5/2022, how would I do that?

here is the pic

enter image description here

Here is the Html

<div style="visibility: visible; overflow: visible; left: 589px; top: 193px; position: absolute;"
     class="gwt-PopupPanel">
    <div class="popupContent">
        <table class="gwt-DatePicker" cellspacing="0" cellpadding="0">
            <tbody>
            <tr>
                <td style="vertical-align: top;" align="left">
                    <table class="datePickerMonthSelector">
                        <colgroup>
                            <col>
                            <col>
                            <col>
                            <col>
                            <col>
                        </colgroup>
                        <tbody>
                        <tr>
                            <td width="1">
                                <div tabindex="0" class="datePickerPreviousButton" role="button" aria-pressed="false">
                                    <input type="text" tabindex="-1" aria-hidden="true"
                                           style="opacity: 0; height: 1px; width: 1px; z-index: -1; overflow: hidden; position: absolute;">
                                    <div class="html-face">«</div>
                                </div>
                            </td>
                            <td width="1">
                                <div tabindex="0" class="datePickerPreviousButton" role="button" aria-pressed="false">
                                    <input type="text" tabindex="-1" aria-hidden="true"
                                           style="opacity: 0; height: 1px; width: 1px; z-index: -1; overflow: hidden; position: absolute;">
                                    <div class="html-face">‹</div>
                                </div>
                            </td>
                            <td class="datePickerMonth" width="100%">Nov 2022</td>
                            <td width="1">
                                <div tabindex="0" class="datePickerNextButton datePickerNextButton-up" role="button"
                                     aria-pressed="false"><input type="text" tabindex="-1" aria-hidden="true"
                                                                 style="opacity: 0; height: 1px; width: 1px; z-index: -1; overflow: hidden; position: absolute;">
                                    <div class="html-face">›</div>
                                </div>
                            </td>
                            <td width="1">
                                <div tabindex="0" class="datePickerNextButton datePickerNextButton-up" role="button"
                                     aria-pressed="false"><input type="text" tabindex="-1" aria-hidden="true"
                                                                 style="opacity: 0; height: 1px; width: 1px; z-index: -1; overflow: hidden; position: absolute;">
                                    <div class="html-face">»</div>
                                </div>
                            </td>
                        </tr>
                        </tbody>
                    </table>
                </td>
            </tr>
            <tr>
                <td style="vertical-align: top;" align="left">
                    <table class="datePickerDays" cellspacing="0" cellpadding="0" border="0">
                        <colgroup>
                            <col>
                            <col>
                            <col>
                            <col>
                            <col>
                            <col>
                            <col>
                        </colgroup>
                        <tbody>
                        <tr>
                            <td class="datePickerWeekendLabel">S</td>
                            <td class="datePickerWeekdayLabel">M</td>
                            <td class="datePickerWeekdayLabel">T</td>
                            <td class="datePickerWeekdayLabel">W</td>
                            <td class="datePickerWeekdayLabel">T</td>
                            <td class="datePickerWeekdayLabel">F</td>
                            <td class="datePickerWeekendLabel">S</td>
                        </tr>
                        <tr>
                            <td>
                                <div tabindex="-1" aria-selected="false"
                                     class="datePickerDay datePickerDayIsWeekend datePickerDayIsFiller ">30
                                </div>
                            </td>
                            <td>
                                <div tabindex="-1" aria-selected="false" class="datePickerDay datePickerDayIsFiller ">
                                    31
                                </div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">1</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">2</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">3</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">4</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay datePickerDayIsWeekend ">
                                    5
                                </div>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay datePickerDayIsWeekend ">
                                    6
                                </div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">7</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">8</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">9</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">10</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">11</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay datePickerDayIsWeekend ">
                                    12
                                </div>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay datePickerDayIsWeekend ">
                                    13
                                </div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">14</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">15</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">16</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">17</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">18</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay datePickerDayIsWeekend ">
                                    19
                                </div>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay datePickerDayIsWeekend ">
                                    20
                                </div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">21</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">22</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">23</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">24</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">25</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay datePickerDayIsWeekend ">
                                    26
                                </div>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay datePickerDayIsWeekend ">
                                    27
                                </div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">28</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">29</div>
                            </td>
                            <td>
                                <div tabindex="0" aria-selected="false" class="datePickerDay ">30</div>
                            </td>
                            <td>
                                <div tabindex="-1" aria-selected="false" class="datePickerDay datePickerDayIsFiller ">
                                    1
                                </div>
                            </td>
                            <td>
                                <div tabindex="-1" aria-selected="false" class="datePickerDay datePickerDayIsFiller ">
                                    2
                                </div>
                            </td>
                            <td>
                                <div tabindex="-1" aria-selected="false"
                                     class="datePickerDay datePickerDayIsWeekend datePickerDayIsFiller ">3
                                </div>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <div tabindex="-1" aria-selected="false"
                                     class="datePickerDay datePickerDayIsWeekend datePickerDayIsFiller ">4
                                </div>
                            </td>
                            <td>
                                <div tabindex="-1" aria-selected="false" class="datePickerDay datePickerDayIsFiller ">
                                    5
                                </div>
                            </td>
                            <td>
                                <div tabindex="-1" aria-selected="false" class="datePickerDay datePickerDayIsFiller ">
                                    6
                                </div>
                            </td>
                            <td>
                                <div tabindex="-1" aria-selected="false" class="datePickerDay datePickerDayIsFiller ">
                                    7
                                </div>
                            </td>
                            <td>
                                <div tabindex="-1" aria-selected="false" class="datePickerDay datePickerDayIsFiller ">
                                    8
                                </div>
                            </td>
                            <td>
                                <div tabindex="-1" aria-selected="false" class="datePickerDay datePickerDayIsFiller ">
                                    9
                                </div>
                            </td>
                            <td>
                                <div tabindex="-1" aria-selected="false"
                                     class="datePickerDay datePickerDayIsWeekend datePickerDayIsFiller ">10
                                </div>
                            </td>
                        </tr>
                        </tbody>
                    </table>
                </td>
            </tr>
            </tbody>
        </table>
    </div>
</div>

Solution

  • The general approach needs to be:

    1. Use the month previous/next buttons to select the month/year
    2. Click the specific day (making sure to ignore the days for the previous/next month)

    The code would look like:

    # The day you would like to pick
    target_date = Time.parse('1/5/2022')
    
    # Pick the month/year (by determining how many months in the past/future you need to go)
    current_date = Time.parse(browser.td(class: 'datePickerMonth').text)
    months_to_increment = (target_date.year * 12 + target_date.month) - (current_date.year * 12 + current_date.month) # From https://stackoverflow.com/a/9428676/1200545
    months_to_increment.abs.times do
        if months_to_increment > 0
            browser.div(class: 'datePickerNextButton', index: 0).click
        else
            browser.div(class: 'datePickerPreviousButton', index: 1).click
        end
    end
    
    # Pick the day (ignoring the datePickerDayIsFiller divs as they are the previous/next month)
    browser.div(text: target_date.day.to_s, class: ['datePickerDay', '!datePickerDayIsFiller']).click