Reputation: 1661
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
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
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