【问题标题】:Select a date from date picker using Selenium webdriver使用 Selenium webdriver 从日期选择器中选择一个日期
【发布时间】:2014-02-19 08:05:40
【问题描述】:

我有一个带有文本框字段的网页。旁边有一个日历图标。当我单击日历图标时,会显示一个日历视图。我认为它不是 jquery 日历。谁能提供一个示例来自动化这种类型的日期选择器。

【问题讨论】:

  • 我试过这个,它工作正常,driver.findElement(By.id("date button")).click();WebElement StartdateWidget = driver.findElement(By.xpath("xpath of date cell"));driver.findElement(By.xpath("xpath of date cell")).click();StartdateWidget.findElements(By.tagName("tr"));StartdateWidget.findElements(By.tagName("td"));
  • 检查这个例子 - testautomationguru.com/…

标签: testing selenium-webdriver automated-tests


【解决方案1】:

我试过这个代码,它也可能对你有用:

            DateFormat dateFormat2 = new SimpleDateFormat("dd"); 
            Date date2 = new Date();

            String today = dateFormat2.format(date2); 

            //find the calendar
            WebElement dateWidget = driver.findElement(By.id("dp-calendar"));  
            List<WebElement> columns=dateWidget.findElements(By.tagName("td"));  

            //comparing the text of cell with today's date and clicking it.
            for (WebElement cell : columns)
            {
               if (cell.getText().equals(today))
               {
                  cell.click();
                  break;
               }
            }

【讨论】:

    【解决方案2】:

    您可以在 Selenium 中以多种方式处理。

    您可以使用直接点击操作来选择值

    您可以编写通用 xpath 以匹配日历中的所有值,并根据需要单击特定日期。

    我已经写了详细的帖子。

    希望对你有帮助

    http://learn-automation.com/handle-calender-in-selenium-webdriver/

    【讨论】:

      【解决方案3】:

      这真的取决于它是如何编码的,但这样的事情可能会起作用:

      driver.findElement(By.id("datepicker")).click(); //click field
      driver.findElement(By.linkText("Next")).click(); //click next month
      driver.findElement(By.linkText("28")).click(); //click day
      

      【讨论】:

        【解决方案4】:

        这对我来说就像一个魅力,日期选择器只有上一个和下一个按钮以及月份和年份作为文本。

        页面对象如下

            [FindsBy(How =How.ClassName, Using = "ui-datepicker-calendar")]
            public IWebElement tblCalendar;
        
            [FindsBy(How = How.XPath, Using = "//a[@title=\"Prev\"]")]
            public IWebElement btnPrevious;
        
            [FindsBy(How = How.XPath, Using = "//a[@title=\"Next\"]")]
            public IWebElement btnNext;
        
            [FindsBy(How = How.ClassName, Using = "ui-datepicker-year")]
            public IWebElement lblYear;
        
            [FindsBy(How = How.ClassName, Using = "ui-datepicker-month")]
            public IWebElement lblMonth;
        
        
        
            public void SelectDateFromDatePicker(string year, string month, string date)
            {
        
                while (year != lblYear.Text)
                {
                    if (int.Parse(year) < int.Parse(lblYear.Text))
                    {
                        btnPrevious.Clicks();
                    }
                    else
                    {
                        btnNext.Clicks();
                    }
                }
        
                while (lblMonth.Text != "January")
                {
                    btnPrevious.Clicks();
                }
        
                while (month != lblMonth.Text)
                {
                       btnNext.Clicks();
                }
        
                IWebElement dateField = PropertiesCollection.driver.FindElement(By.XPath("//a[text()=\""+ date+"\"]"));
                dateField.Clicks();
            }
        

        【讨论】:

        【解决方案5】:

        请使用此代码从两个 Jquery 日历(如航班预订网站)中选择日期。

            Hashtable h=new Hashtable();
            h.put("January",0 );
            h.put("February",1);
            h.put("March",2);
            h.put("April",3);
            h.put("May",4);
            h.put("June",5);
            h.put("July",6);
            h.put("August",7);
            h.put("September",8);
            h.put("October",9);
            h.put("November",10);
            h.put("December",11);
        
        
            int expMonth;
            int expYear;
        
            // Calendar Month and Year
            String calMonth = null;
            String calYear = null;
            boolean dateNotFound;
            dateNotFound = true;
            expMonth= 5;
            expYear = 2014;
        
            while(dateNotFound)
            {
        
                calMonth = driver.findElement(By.className("ui-datepicker-month")).getText(); // get the text of month
                calYear = driver.findElement(By.className("ui-datepicker-year")).getText();
        
        
        
        
                if(((Integer)h.get(calMonth))+1 == expMonth && (expYear == Integer.parseInt(calYear)))
                {
                    String block="//div[@class='monthBlock first']/table/tbody/tr/td";  // THIS IS FIRST CALENDAR
                    selectDate(expDate,block); 
                    dateNotFound = false; 
                }
                // parseInt - Converts String to integer and indexof( It will return the index position of String)
                else if(((Integer)h.get(calMonth))+1 < expMonth && (expYear == Integer.parseInt(calYear)) || expYear > Integer.parseInt(calYear))
                {
                    String block="//div[@class='monthBlock last']/table/tbody/tr/td"; // THIS IS SECOND CALENDAR
        
        
                                    selectDate(expDate,block); // PASSING DATE AND CALENDAR
                                    dateNotFound = false; // Otherwise it will rotate continuously 
                }
                else if((Integer)h.get(calMonth)+1 > expMonth && (expYear == Integer.parseInt(calYear)) || expYear < Integer.parseInt(calYear))
                {
                    System.out.println(" Please enter the date greater than Current date");
                    dateNotFound = false;
        
                }
            }
        
            }
            //Thread.sleep(3000);
        
        
            public static void selectDate(String date,String block) throws IOException
            {
        
                            String monthblock=block;
        
                List<WebElement> dateWidget = driver.findElements(By.xpath(monthblock));    
        
                for (WebElement cell: dateWidget)
                {
                    //Selects Date
                    if (cell.getText().equals(date))
                    {
                        cell.findElement(By.linkText(date)).click();
                        break;
                    }
        
                }
        
                //Doubt : How to verify the expected results and how to sort the program
        
        
        
                driver.findElement(By.id("SearchBtn")).submit();
        
                //driver.quit();
            }
        

        【讨论】:

          【解决方案6】:

          试试这个,

          http://seleniumcapsules.blogspot.com/2012/10/design-of-datepicker.html

          1. 用作触发器的图标;
          2. 点击图标时显示日历;
          3. 上一年按钮(
          4. 明年按钮(>>),可选;
          5. 上个月按钮(
          6. 下个月按钮(>);
          7. 日期按钮;
          8. 工作日指标;
          9. 日历标题,即“2011 年 9 月”,代表当前月份和当前年份。

          【讨论】:

            【解决方案7】:

            我认为会有不同的方法为不同的日期选择器格式选择日期。 对于日期选择器,您需要从下拉列表中选择年份和月份,然后选择/单击日期, 我写了以下代码。

            private void setupDate(WebDriver driver, String csvRow) throws Exception {
                String date[] = (csvRow).split("-");
                driver.findElement(By.id("flddateanchor")).click();
                new Select(driver.findElement(By
                        .cssSelector("select.ui-datepicker-year")))
                        .selectByVisibleText(date[0]);
                Thread.sleep(1000);
                new Select(driver.findElement(By
                        .cssSelector("select.ui-datepicker-month")))
                        .selectByVisibleText(date[1]);
                Thread.sleep(1000);
                driver.findElement(By.linkText(date[2])).click();
                Thread.sleep(1000);
            }
            

            我通过 Selenium Firefox IDE 获得了 cssSelector 部分。另外,我的 Date(csvRow) 是 (2015-03-31) 格式。

            希望对你有帮助。

            【讨论】:

            • 最好使用 WebDriverWait 类来避免 Thread.sleep(1000) 调用。
            【解决方案8】:

            这是一个整洁的解决方案,您可以将目标日期作为日历对象提供。

            // Used to translate the Month value of a JQuery calendar to the month value expected by a Calendar.
            private static final Map<String,Integer> MONTH_TO_CALENDAR_INDEX = new HashMap<String,Integer>();
            static {
                MONTH_TO_CALENDAR_INDEX.put("January",  0);
                MONTH_TO_CALENDAR_INDEX.put("February",1);
                MONTH_TO_CALENDAR_INDEX.put("March",2);
                MONTH_TO_CALENDAR_INDEX.put("April",3);
                MONTH_TO_CALENDAR_INDEX.put("May",4);
                MONTH_TO_CALENDAR_INDEX.put("June",5);
                MONTH_TO_CALENDAR_INDEX.put("July",6);
                MONTH_TO_CALENDAR_INDEX.put("August",7);
                MONTH_TO_CALENDAR_INDEX.put("September",8);
                MONTH_TO_CALENDAR_INDEX.put("October",9);
                MONTH_TO_CALENDAR_INDEX.put("November",10);
                MONTH_TO_CALENDAR_INDEX.put("December",11);
            }
            
                    // ====================================================================================================
                    // setCalendarPicker
                    // ====================================================================================================
            
                    /**
                     * Sets the value of specified web element while assuming the element is a JQuery calendar.
                     * @param byOpen The By phrase that locates the control that opens the JQuery calendar when clicked.
                     * @param byPicker The By phrase that locates the JQuery calendar.
                     * @param targetDate The target date that you want set.
                     * @throws AssertionError if the method is unable to set the date.
                     */
            
                    public void setCalendarPicker(By byOpen, By byPicker, Calendar targetDate) {
            
                        // Open the JQuery calendar.
                        WebElement opener = driver.findElement(byOpen);
                        opener.click();
            
                        // Locate the JQuery calendar.
                        WebElement picker = driver.findElement(byPicker);
            
                        // Calculate the target and current year-and-month as an integer where value = year*12+month.
                        // The difference between the two is the number of months we have to move ahead or backward.
                        int targetYearMonth = targetDate.get(Calendar.YEAR) * 12 + targetDate.get(Calendar.MONTH);
                        int currentYearMonth = Integer.valueOf(picker.findElement(By.className("ui-datepicker-year")).getText()) * 12
                                + Integer.valueOf(MONTH_TO_CALENDAR_INDEX.get(picker.findElement(By.className("ui-datepicker-month")).getText()));
                        // Calculate the number of months we need to move the JQuery calendar.
                        int delta = targetYearMonth - currentYearMonth;
                        // As a sanity check, let's not allow more than 10 years so that we don't inadvertently spin in a loop for zillions of months.
                        if (Math.abs(delta) > 120) throw new AssertionError("Target date is more than 10 years away");
            
                        // Push the JQuery calendar forward or backward as appropriate.
                        if (delta > 0) {
                            while (delta-- > 0) picker.findElement(By.className("ui-icon-circle-triangle-e")).click();
                        } else if (delta < 0 ){
                            while (delta++ < 0) picker.findElement(By.className("ui-icon-circle-triangle-w")).click();
                        }
            
                        // Select the day within the month.
                        String dayOfMonth = String.valueOf(targetDate.get(Calendar.DAY_OF_MONTH));
                        WebElement tableOfDays = picker.findElement(By.cssSelector("tbody:nth-child(2)"));
                        for (WebElement we : tableOfDays.findElements(By.tagName("td"))) {
                            if (dayOfMonth.equals(we.getText())) {
                                we.click();
            
                                // Send a tab to completely leave this control.  If the next control the user will access is another CalendarPicker,
                                // the picker might not get selected properly if we stay on the current control.
                                opener.sendKeys("\t");
            
                                return;
                            }
                        }
            
                        throw new AssertionError(String.format("Unable to select specified day"));
                    }
            

            【讨论】:

              【解决方案9】:

              在这里,我向您展示我在其官方网站“https://jqueryui.com/resources/demos/datepicker/default.html”上自动化 jqueryui 日历的原始代码。

              复制粘贴代码,看看它的工作原理:)

              如果你喜欢,请投票 :) 问候 阿瓦德·戈亚尔


              public class JQueryDatePicker2 {
              static int targetDay = 0, targetMonth = 0, targetYear = 0;
              
              static int currenttDate = 0, currenttMonth = 0, currenttYear = 0;
              
              static int jumMonthBy = 0;
              
              static boolean increment = true;
              
              public static void main(String[] args) throws InterruptedException {
                  // TODO Auto-generated method stub
                  String dateToSet = "16/12/2016";
              
                  getCurrentDayMonth();
                  System.out.println(currenttDate);
                  System.out.println(currenttMonth);
                  System.out.println(currenttYear);
              
                  getTargetDayMonthYear(dateToSet);
                  System.out.println(targetDay);
                  System.out.println(targetMonth);
                  System.out.println(targetYear);
              
                  calculateToHowManyMonthToJump();
                  System.out.println(jumMonthBy);
                  System.out.println(increment);
              
                  System.setProperty("webdriver.chrome.driver",
                          "C:\\Users\\avadh.goyal\\Desktop\\selenium-2.52.0\\web driver\\chromedriver.exe");
                  WebDriver driver = new ChromeDriver();
                  driver.navigate().to(
                          "https://jqueryui.com/resources/demos/datepicker/default.html");
                  driver.manage().window().maximize();
                  Thread.sleep(3000);
              
                  driver.findElement(By.xpath("//*[@id='datepicker']")).click();
              
                  for (int i = 0; i < jumMonthBy; i++) {
                      if (increment) {
                          driver.findElement(
                                  By.xpath("//*[@id='ui-datepicker-div']/div/a[2]/span"))
                                  .click();
                      } else {
                          driver.findElement(
                                  By.xpath("//*[@id='ui-datepicker-div']/div/a[1]/span"))
                                  .click();
                      }
                      Thread.sleep(1000);
              
                  }
              
                  driver.findElement(By.linkText(Integer.toString(targetDay))).click();
              
              }
              
              public static void getCurrentDayMonth() {
              
                  Calendar cal = Calendar.getInstance();
                  currenttDate = cal.get(Calendar.DAY_OF_MONTH);
                  currenttMonth = cal.get(Calendar.MONTH) + 1;
                  currenttYear = cal.get(Calendar.YEAR);
              }
              
              public static void getTargetDayMonthYear(String dateString) {
                  int firstIndex = dateString.indexOf("/");
                  int lastIndex = dateString.lastIndexOf("/");
              
                  String day = dateString.substring(0, firstIndex);
                  targetDay = Integer.parseInt(day);
              
                  String month = dateString.substring(firstIndex + 1, lastIndex);
                  targetMonth = Integer.parseInt(month);
              
                  String year = dateString.substring(lastIndex + 1, dateString.length());
                  targetYear = Integer.parseInt(year);
              
              }
              
              public static void calculateToHowManyMonthToJump() {
              
                  if ((targetMonth - currenttMonth) > 0) {
                      jumMonthBy = targetMonth - currenttMonth;
              
                  } else {
                      jumMonthBy = currenttMonth - targetMonth;
                      increment = false;
                  }
              }
              

              }

              【讨论】:

              • 请不要复制粘贴多个问题的相同答案。此外,在这里要求支持也违反了礼节。
              【解决方案10】:

              此代码应该可以正常工作以从日历中获取当前日期。

              String today=getCurrentDay(); //function 
              driver.findElement(By.xpath("here xpath of textbox")).click();
              Thread.sleep(5000);
              WebElement dateWidgetForm= driver.findElement(By.xpath("here xpath of calender"));
              List<WebElement> columns = dateWidgetForm.findElements(By.tagName("td"));
              
                  for (WebElement cell: columns) {
                    String z=cell.getAttribute("class").toString();
                    if(z.equalsIgnoreCase("day")){
                    if (cell.getText().equals(today)) {
                      cell.click();
                      break;
                    }
                  }
              
              private String getCurrentDay() {
               Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
               //Get Current Day as a number
               int todayInt = calendar.get(Calendar.DAY_OF_MONTH);
               System.out.println("Today Int: " + todayInt +"\n");
              
               //Integer to String Conversion
               String todayStr = Integer.toString(todayInt);
               return todayStr;
              }
              

              【讨论】:

                【解决方案11】:
                WebDriver driver;
                
                public void launch(){
                
                    driver = new FirefoxDriver();
                    driver.get("http://www.cleartrip.com/");
                    driver.manage().window().maximize();
                    System.out.println("The browser launched successfully");
                    }
                public void clickdate(String inputDate){
                    WebElement ele =driver.findElement(By.id("DepartDate"));
                    ele.click();
                    String month = driver.findElement(By.xpath("//div[@class='monthBlock first']/div[1]//span[1]")).getText();
                    String year = driver.findElement(By.xpath("//div[@class='monthBlock first']/div[1]//span[2]")).getText();
                    System.out.println("Application month : "+month + " Year :"+year);
                    int monthNum = getMonthNum(month);
                    System.out.println("Enum Num : "+monthNum);
                    String[] parts = inputDate.split("/");
                    int noOfHits = ((Integer.parseInt(parts[2])-Integer.parseInt(year))*12)+(Integer.parseInt(parts[1])-monthNum);
                    System.out.println("No OF Hits "+noOfHits);
                    for(int i=0; i< noOfHits;i++){
                    driver.findElement(By.className("nextMonth ")).click();
                    }
                    List<WebElement> cals=driver.findElements(By.xpath("//div[@class='monthBlock first']//tr"));
                    System.out.println(cals.size());
                    for( WebElement daterow : cals){
                    List<WebElement> datenums = daterow.findElements(By.xpath("//td"));
                    /*iterating the "td" list*/
                    for(WebElement date : datenums ){
                    /* Checking The our input Date(if it match go inside and click*/
                    if(date.getText().equalsIgnoreCase(parts[0])){
                    date.click();
                    break;
                                          }
                                     }
                                 }
                }
                
                public  int getMonthNum(String month){
                    for (Month mName : Month.values()) {
                    if(mName.name().equalsIgnoreCase(month))
                    return mName.value;
                    }
                    return -1;
                    }
                
                public enum Month{
                    January(1), February(2), March(3), April(4), May(5), June(6) , July(7), August(8), September(9), October(10), November(11),December(12);
                    private int value;
                
                    private Month(int value) {
                    this.value = value;
                    }
                
                    }
                
                
                public static void main(String[] args)  {
                    // TODO Auto-generated method stub
                    Cleartrip cl=new Cleartrip();
                    cl.launch();
                    cl.clickdate("24/11/2015");
                    }
                }
                

                【讨论】:

                  【解决方案12】:

                  如果日期选择器来自简单的 html5 输入并且目标是测试添加到测试中的任何事件,则有一个论点是保持简单和愚蠢。举个例子:

                  <input type=date name=mydate /> 
                  

                  如果想设置一个测试,其中“mydate”被硬编码为 02/22/2017,python 的一种解决方案是使用以下代码,该代码很简单,可以调试以观察它的作用:

                  def setdate(elem_name, date_str):
                      elem = driver.find_element_by_name('mydate')
                      elem.click()
                      elem.send_keys(Keys.ARROW_LEFT)
                      elem.send_keys(Keys.ARROW_LEFT)
                      elem.send_keys(date_str)
                  
                  setdate('mydate'', '02222017')
                  

                  【讨论】:

                    【解决方案13】:

                    做吧

                      JavascriptExecutor js = (JavascriptExecutor)driver;
                      js.executeScript("document.getElementById('id').value='1988-01-01'");
                    

                    【讨论】:

                      猜你喜欢
                      • 2018-01-17
                      • 1970-01-01
                      • 2019-03-22
                      • 2023-03-18
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多