web-dev-qa-db-fra.com

Comment sélectionner le sélecteur de date dans Selenium WebDriver

Travaille actuellement sur Selenium WebDriver et avec Java . Je souhaite sélectionner les valeurs dans date range dans le menu déroulant. Je souhaite savoir comment sélectionner les valeurs en tant que Date, Month and year dans le menu déroulant du sélecteur de date.

Voici la balise HTML:

<dd id="date-element">
<input id="fromDate" class="hasDatepicker" type="text" style="width:57px; padding:3px 1px; font-size:11px;" readonly="readonly" name="fromDate" value="01 Jan 2013">

<input id="toDate" class="hasDatepicker" type="text" style="width:57px; padding:3px 1px; font-size:11px;" readonly="readonly" name="toDate" value="31 Dec 2013">  

enter image description here

Le code ci-dessous que j'ai essayé:

Log.info("Clicking on From daterange dropdown");
JavascriptExecutor executor8 = (JavascriptExecutor)driver;
executor8.executeScript("document.getElementById('fromDate').style.display='block';");
Select select8 = new Select(driver.findElement(By.id("fromDate")));
select8.selectByVisibleText("10 Jan 2013");
Thread.sleep(3000);

Log.info("Clicking on To daterange dropdown");
JavascriptExecutor executor10 = (JavascriptExecutor)driver;
executor10.executeScript("document.getElementById('toDate').style.display='block';");
Select select10 = new Select(driver.findElement(By.id("toDate")));
select10.selectByVisibleText("31 Dec 2013");
Thread.sleep(3000);
9
Amirdha

DatePicker ne sont pas des éléments Select. Ce que vous faites dans votre code est faux. 

Datepicker est en fait un tableau avec un ensemble de lignes et de colonnes. Pour sélectionner une date, il vous suffit de naviguer vers la cellule où notre date souhaitée est présente.

Donc, votre code devrait être comme ça:

WebElement dateWidget = driver.findElement(your locator);
List<WebElement> columns=dateWidget.findElements(By.tagName("td"));

for (WebElement cell: columns){
   //Select 13th Date 
   if (cell.getText().equals("13")){
      cell.findElement(By.linkText("13")).click();
      break;
 }
12
Ant's

Vous ne pouvez pas essayer ceci, voir si cela fonctionne pour vous.

Plutôt que de choisir la date à partir du sélecteur de date, vous pouvez activer la zone de date à l'aide de javascript et entrer la date requise. Cela éviterait un temps excessif de parcourir tous les éléments de date jusqu'à ce que vous atteignez celui que vous souhaitez sélectionner.

Code pour à compter de la date

((JavascriptExecutor)driver).executeScript ("document.getElementById('fromDate').removeAttribute('readonly',0);"); // Enables the from date box

WebElement fromDateBox= driver.findElement(By.id("fromDate"));
fromDateBox.clear();
fromDateBox.sendKeys("8-Dec-2014"); //Enter date in required format

Code pour à ce jour

((JavascriptExecutor)driver).executeScript ("document.getElementById('toDate').removeAttribute('readonly',0);"); // Enables the from date box

WebElement toDateBox= driver.findElement(By.id("toDate"));
toDateBox.clear();
toDateBox.sendKeys("15-Dec-2014"); //Enter date in required format
5
Shoaib Shaikh

Je pense que cela pourrait être fait d'une manière beaucoup plus simple:

  1. Trouvez le localisateur du mois (utilisez Firebug/Firepath)
  2. Ceci est probablement un élément Select, utilisez Selenium pour sélectionner le mois
  3. Faites la même chose pour l'année
  4. Cliquez sur le lien "31" ou sur la date de votre choix.

Donc, le code ressemblerait à quelque chose comme ça:

WebElement month = driver.findElement(month combo locator);
Select monthCombo = new Select(month);
monthCombo.selectByVisibleText("March");

WebElement year = driver.findElement(year combo locator);
Select yearCombo = new Select(year);
yearCombo.selectByVisibleText("2015");

driver.click(By.linkText("31"));

Cela ne fonctionnera pas si les listes déroulantes du sélecteur de date ne sont pas sélectionnées, mais la plupart de celles que j'ai vues sont des éléments individuels (sélection, liens, etc.).

2
zmorris

Vous pouvez directement utiliser le javascript suivant

((JavascriptExecutor)driver).executeScript("document.getElementById('fromDate').setAttribute('value','10 Jan 2013')")
2
MilanYadav

essayez de SendKeys au lieu de choisir la date

driver.FindElement(yourBy).SendKeys(yourDateTime.ToString("ddd, dd.MM.yyyy",CultureInfo.CreateSpecificCulture("en-US")));

Si cela ne fonctionne pas, essayez d'envoyer un 'onglet' natif

element.SendKeys(OpenQA.Selenium.Keys.Tab);
1
pw1

Ne pas injecter javascript. C'est une mauvaise pratique.

Je modéliserais DatePicker comme un élément comme textbox/select, comme indiqué ci-dessous. 

Pour la réponse détaillée - consultez ici - http://www.testautomationguru.com/Selenium-webdriver-automating-custom-controls-datepicker/

public class DatePicker {

    private static final String dateFormat = "dd MMM yyyy";

    @FindBy(css = "a.ui-datepicker-prev")
    private WebElement prev;

    @FindBy(css = "a.ui-datepicker-next")
    private WebElement next;

    @FindBy(css = "div.ui-datepicker-title")
    private WebElement curDate;

    @FindBy(css = "a.ui-state-default")
    private List < WebElement > dates;

    public void setDate(String date) {

        long diff = this.getDateDifferenceInMonths(date);
        int day = this.getDay(date);

        WebElement arrow = diff >= 0 ? next : prev;
        diff = Math.abs(diff);

        //click the arrows
        for (int i = 0; i < diff; i++)
            arrow.click();

        //select the date
        dates.stream()
            .filter(ele - > Integer.parseInt(ele.getText()) == day)
            .findFirst()
            .ifPresent(ele - > ele.click());

    }

    private int getDay(String date) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(dateFormat);
        LocalDate dpToDate = LocalDate.parse(date, dtf);
        return dpToDate.getDayOfMonth();
    }

    private long getDateDifferenceInMonths(String date) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(dateFormat);
        LocalDate dpCurDate = LocalDate.parse("01 " + this.getCurrentMonthFromDatePicker(), dtf);
        LocalDate dpToDate = LocalDate.parse(date, dtf);
        return YearMonth.from(dpCurDate).until(dpToDate, ChronoUnit.MONTHS);
    }

    private String getCurrentMonthFromDatePicker() {
        return this.curDate.getText();
    }

}
0
vins
public String datePicker(String object,String data){
    APP_LOGS.debug("selecting date");
    try{

        WebElement dateWidget = driver.findElement(By.xpath(OR.getProperty(object)));

        List<WebElement> rows = dateWidget.findElements(By.tagName("tr"));  
        List<WebElement> columns = dateWidget.findElements(By.tagName("td"));  

        for (WebElement cell: columns){
            if (cell.getText().equals(data)){
                cell.findElement(By.linkText(data)).click();
                break; 
            }
        }
    }catch(Exception e){
        return Constants.KEYWORD_FAIL+" -- Not able to select the date"+e.getMessage();
    }
    return Constants.KEYWORD_PASS;
}
0