如何使用Selenium Webriver处理具有相同html标记的月份和年份的日期选择器?

时间:2017-10-13 21:36:52

标签: java selenium selenium-webdriver datepicker logic

我想创建一个接受以下格式“ 2018年4月1日”的String变量的方法。然后将该字符串拆分,并使用日期“成分”来选择选择器See the picker image中的日期。我已经介绍了选择日期并点击更改“月 - 年”对的箭头。我也知道如何达到用户插入的年份,但我不确定如何在达到年份时选择正确的月份。下面是我到目前为止提出的代码。

public void pickTheDate() {

    String date = "10 April 2018";
    String[] dateElements = date.split(" ");
    WebElement nextMonth = driver.findElement(By.xpath("somexpath"));
    WebElement previousMonth = driver.findElement(By.xpath("somexpath1"));

    String dayFromUserInput = dateElements[0];
    String monthFromUserInput = dateElements[1];
    String yearFromUserInput = dateElements[2];

    WebDriverWait wait = new WebDriverWait(driver, 10);

    WebElement datePickerHeader= wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("somexpath")));
    String textFromDatePickerHeader = datePickerHeader.getText();

让我们假装日期选择器标题中的日期是“2017年10月”

    String[] dateElementsFromDatePickerHeader = textFromDatePickerHeader.split(" ");
    int yearDiff = Integer.parseInt(yearFromUserInput) - Integer.parseInt(dateElementsFromDatePickerHeader[1]);

    if (yearDiff != 0) {
        //moving to next year
        if (yearDiff > 0) {
            for (int i = 0; i < yearDiff; i++) {
                nextMonth.click();
            }

此时我知道我到达的月份是'2018年1月'

        }
        //moving to previous year
        else if (yearDiff < 0) {
            for (int i = 0; i < (yearDiff * (-1)); i++) {
                previousMonth.click();
            }
        }
    }
}

如果我要在2016年内搜索日期,我知道第一个遇到的月份将是“2016年12月”。 请告知我如何将导航的正确逻辑合并到用户插入的月份。提前谢谢。

1 个答案:

答案 0 :(得分:1)

它取决于您的日期选择器行为。作为参考,我遵循日期选择器的结构:

enter image description here

如果单击“2017年10月”标题,则会打开几个月进行选择,如下图所示:

enter image description here

再次单击“2017”标题,然后打开“选择年份”

enter image description here

所以这里的自动化测试用例将是

  1. 获取日期为2017年10月25日
  2. 以3个块分割日期
  3. 点击标题并导航,直至显示年份列表以选择
  4. 将日历导航到收到的年份,即 2017
  5. 然后导航并选择收到的月份,即 10月
  6. 最后选择日期,即 25
  7. 在此处找到示例代码:

    public void enterFromDate(String fromDate) throws InterruptedException
    {
         // Split the data and store it in string array
         String[]  data = fromDate.split(" ");
    
         // click datepicker icon
         fromDateCalenderIcon.click();
         // Click date picker header, It moves to month list
         calenderHeader.click();
         // Again click date picker header, It now moves to Year listing
         calenderHeader.click();
    
    
         mainloop: while(true)
         {
             //Iterate all year
             for(int i=0;i<datePickerData.size();i++)
             {
                 // check weather year available in list if yes then select it 
                 if(datePickerData.get(i).getText().trim().contains(data[2]))
                 {
    
                     datePickerData.get(i).click();     
                     break mainloop;                     
                 }
             }
              // else click back arrow 
             datePickerLeftArrow.click();
         }
    
         // Iterate month list
         for(WebElement e: datePickerData)
         {
             // If months available then click on it 
             if(e.getText().equals(data[1]))
             {
                 e.click();
                 break;
             }
         }
    
         // Iterate Date and select as required 
         for(WebElement e: datePickerData)
         {
             if((e.getText().equals(data[0]) && (e.findElement(By.tagName("span"))).getAttribute("class").equals("ng-binding")))
             {
                 e.click();
                 break;
             }
         }
    }