gabrown86
gabrown86

Reputation: 1661

Automate filling in date using selenium

I am trying to fill in the form on the website below using selenium. https://bookings.doc.govt.nz/Saturn/Facilities/SearchViewGW.aspx

However I am struggling to set the date (or even get the date picker to come up).

I can see that the value is stored there, by using the code:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
browser = webdriver.Firefox()
browser.get('https://bookings.doc.govt.nz/Saturn/Facilities/SearchViewGW.aspx')

el = browser.find_element_by_id('mainContent_homeContent_txtArrivalDate')
el.get_property('value')
el.clear()
el.send_keys("21122018")

However clearing the date and sending a new key causes an error popup. Any suggestions on what element needs clicking on to bring up the date picker, or how to directly set the date required?

Upvotes: 1

Views: 2885

Answers (2)

Satish Michael
Satish Michael

Reputation: 2015

Try this, just using JavaScript to set the value attribute on the element. This may not be the approach you are looking for, if it is replace the time.sleep with a better approach (wait for the element to be available).

I have hardcoded the date 20/10/2018

from selenium.webdriver import Chrome

driver = Chrome()
driver.get('https://bookings.doc.govt.nz/Saturn/Facilities/SearchViewGW.aspx')

import time
time.sleep(5)

driver.execute_script(
   "document.getElementById(
       'mainContent_homeContent_txtArrivalDate').setAttribute('value', '20/10/2018')"
)

Upvotes: 3

Kieran Andrews
Kieran Andrews

Reputation: 5885

The field you have referenced does not allow you to click on it and type numbers so you will need to take another approach.

Check out this guide here: https://www.guru99.com/handling-date-time-picker-using-selenium.html

The provided code is Java but the Selenium API should be similar as well as the approach you need to take.

In summary, you will need to write code like this (copied from article):

    //DAte and Time to be set in textbox

    String dateTime ="12/07/2014 2:00 PM";

    WebDriver driver = new FirefoxDriver();

    driver.manage().window().maximize();

    driver.get("http://demos.telerik.com/kendo-ui/datetimepicker/index");

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    //button to open calendar

    WebElement selectDate = driver.findElement(By.xpath("//span[@aria-controls='datetimepicker_dateview']"));

selectDate.click();

//button to move next in calendar

WebElement nextLink = driver.findElement(By.xpath("//div[@id='datetimepicker_dateview']//div[@class='k-header']//a[contains(@class,'k-nav-next')]"));

//button to click in center of calendar header

WebElement midLink = driver.findElement(By.xpath("//div[@id='datetimepicker_dateview']//div[@class='k-header']//a[contains(@class,'k-nav-fast')]"));

//button to move previous month in calendar

WebElement previousLink = driver.findElement(By.xpath("//div[@id='datetimepicker_dateview']//div[@class='k-header']//a[contains(@class,'k-nav-prev')]")); 

    //Split the date time to get only the date part

    String date_dd_MM_yyyy[] = (dateTime.split(" ")[0]).split("/");

    //get the year difference between current year and year to set in calander

    int yearDiff = Integer.parseInt(date_dd_MM_yyyy[2])- Calendar.getInstance().get(Calendar.YEAR);

    midLink.click();

    if(yearDiff!=0){

        //if you have to move next year

        if(yearDiff>0){

            for(int i=0;i< yearDiff;i++){

                System.out.println("Year Diff->"+i);

                nextLink.click();

            }

        }

        //if you have to move previous year

        else if(yearDiff<0){

            for(int i=0;i< (yearDiff*(-1));i++){

                System.out.println("Year Diff->"+i);

                previousLink.click();

            }

        }

    }

    Thread.sleep(1000);

    //Get all months from calendar to select correct one

    List<WebElement> list_AllMonthToBook = driver.findElements(By.xpath("//div[@id='datetimepicker_dateview']//table//tbody//td[not(contains(@class,'k-other-month'))]"));

    list_AllMonthToBook.get(Integer.parseInt(date_dd_MM_yyyy[1])-1).click();

    Thread.sleep(1000);

    //get all dates from calendar to select correct one

    List<WebElement> list_AllDateToBook = driver.findElements(By.xpath("//div[@id='datetimepicker_dateview']//table//tbody//td[not(contains(@class,'k-other-month'))]"));

    list_AllDateToBook.get(Integer.parseInt(date_dd_MM_yyyy[0])-1).click();

    ///FOR TIME

    WebElement selectTime = driver.findElement(By.xpath("//span[@aria-controls='datetimepicker_timeview']"));

    //click time picker button

    selectTime.click();

    //get list of times

    List<WebElement> allTime = driver.findElements(By.xpath("//div[@data-role='popup'][contains(@style,'display: block')]//ul//li[@role='option']"));

    dateTime = dateTime.split(" ")[1]+" "+dateTime.split(" ")[2];

 //select correct time

    for (WebElement webElement : allTime) {

        if(webElement.getText().equalsIgnoreCase(dateTime))

        {

            webElement.click();

        }

    }

Upvotes: 0

Related Questions