Como selecionar a data do DatePicker / Calendar no Selenium Webdriver

Para seleção de DateTime, HTML5 tem um novo controle mostrado abaixo.

A página acima pode ser acessada aqui

Se virmos o DOM do controle DateTime Picker, haverá apenas uma caixa de entrada para data e hora.

Portanto, para lidar com este tipo de controle primeiro preencheremos a data sem separar com delimitador, ou seja, se a data for 25/09/2013, então passaremos 09252013 para a caixa de entrada. Uma vez feito isso, vamos mudar o foco de data para hora pressionando 'tab' e preencher o tempo.

Se precisarmos preencher 14h45, passaremos '14h45' para a mesma caixa de entrada.

O código para selecionador de data se parece com isto -

import java.util.List; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.Test; public class DateTimePicker { @Test public void dateTimePicker(){ System.setProperty('webdriver.chrome.driver', 'chromedriver.exe'); WebDriver driver = new ChromeDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get('https://demo.on2vhf.be/test/'); //Find the date time picker control WebElement dateBox = driver.findElement(By.xpath('//form//input[@name='bdaytime']')); //Fill date as mm/dd/yyyy as 09/25/2013 dateBox.sendKeys('09252013'); //Press tab to shift focus to time field dateBox.sendKeys(Keys.TAB); //Fill time as 02:45 PM dateBox.sendKeys('0245PM'); } }

A saída será como-

Vejamos outro exemplo de calendário. Usaremos o controle Telerik DateTimePicker. Pode ser acessado aqui

Aqui, se precisarmos alterar o mês, temos que clicar no meio do cabeçalho do calendário.

Da mesma forma, se precisarmos alterar o ano, podemos fazê-lo clicando nos links próximo ou anterior no selecionador de data.

E, finalmente, para alterar a hora, podemos selecionar a hora correta na lista suspensa (Observação: aqui, a hora é selecionada em um intervalo de 30 minutos, ou seja, 12:00, 12:30, 1:00, 1:30 etc.).

Um exemplo completo se parece com-

import java.util.Calendar; import java.util.List; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.Test; public class DatePicker { @Test public void testDAtePicker() throws Exception{ //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('https://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'+i); nextLink.click(); } } //if you have to move previous year else if(yearDiff<0){ for(int i=0;i'+i); previousLink.click(); } } } Thread.sleep(1000); //Get all months from calendar to select correct one List 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 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 allTime = driver.findElements(By.xpath('//div[@data-][contains(@style,'display: block')]//ul//li[@]')); dateTime = dateTime.split(' ')[1]+' '+dateTime.split(' ')[2]; //select correct time for (WebElement webElement : allTime) { if(webElement.getText().equalsIgnoreCase(dateTime)) { webElement.click(); } } } }

A saída será como