【问题标题】:Date selector based on months in JavaJava中基于月份的日期选择器
【发布时间】:2018-04-11 09:26:16
【问题描述】:

我有用于 Selenium Webdriver TestNG 的 Java 代码。用于比较网站上的日期是否与今天的日期相同。 问题是 2018 年 4 月 11 日网页 dateOnWebpage 上的日期是格式

今天 2018 年 4 月 11 日

所以我做了选择器来比较日期格式,如果月份 if(javaDateSelector < 10) 比要比较的日期格式为 M/dd/yyyy 否则为格式 MM/dd/yyyy。

有没有比我做的更好的编码方式?因为我需要将日期解析为字符串,而不是解析为 int 来比较它,而且代码很长。

@Test(priority=3)
 public void test3DateCheck() throws Exception
 {

  String dateOnWebpage = driver.findElement(By.xpath("//div[@id='homeCalendarSection']/div/div[2]/table/tbody/tr/td/div/ul/li")).getText();

  System.out.println("Today Date on webpage is : " + dateOnWebpage);

  //DateFormat dateFormat1 = new SimpleDateFormat("M/dd/yyyy");
  DateFormat dateFormat1 = new SimpleDateFormat("MM");
  Date date = new Date();
  String javaDate1 = dateFormat1.format(date);
  int javaDateSelector = Integer.parseInt(javaDate1);

  if(javaDateSelector < 10)
  { 
      DateFormat dateFormat2 = new SimpleDateFormat("M/dd/yyyy");  
      String javaDate2 = dateFormat2.format(date);
      System.out.println("Today Date from Java is : " + javaDate2);
      Assert.assertEquals(dateOnWebpage, "Today " + javaDate2);
  }
  else
  {
      DateFormat dateFormat3 = new SimpleDateFormat("MM/dd/yyyy");  
      String javaDate3 = dateFormat3.format(date);
      System.out.println("Today Date from Java is : " + javaDate3);
      Assert.assertEquals(dateOnWebpage, "Today " + javaDate3);
  }

}

【问题讨论】:

  • 我建议你避免使用SimpleDateFormat 类。它不仅过时了,而且出了名的麻烦。今天我们在java.time, the modern Java date and time API 中做得更好。
  • 4 月 9 日会在网页上显示为 4/9/2018 还是 4/09/2018
  • 不需要有条件地切换格式。 M/dd/yyyyMM/dd/yyyy 相同的月份 >=10。
  • 1)@Ole V.V.对不起,我不知道 4 月 9 日是否在网页上显示为 2018 年 4 月 9 日或 2018 年 4 月 9 日 - 但谢谢这可能会导致另一个问题。 2)@Thomas 我需要有条件地切换格式 M/dd/yyyy 与 MM/dd/yyyy 不同,如果我这样做我得到错误 java.lang.AssertionError: expected [Today 04/11/2018] 但发现 [今天 2018 年 4 月 11 日]

标签: java date selenium-webdriver compare


【解决方案1】:

如果您不在乎网页上的日期是否以前导零表示月份和月份,只是想测试日期是否正确:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("'Today' M/d/uuuu");
    LocalDate today = LocalDate.now(ZoneId.of("Pacific/Norfolk"));
    System.out.println("Today is " + today);
    LocalDate observedDate = LocalDate.parse(dateOnWebpage, dateFormatter);
    Assert.assertEquals(today, observedDate);

我解析日期并测试它,而不是测试字符串。尽管该模式中有一个 M 和一个 d,但解析两位数月份和两位数月份日期没有问题。

另一方面,如果您还想测试网页上的日期是否没有任何前导零,最好测试字符串,就像您已经做过的那样:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("M/d/uuuu");
    LocalDate today = LocalDate.now(ZoneId.of("Pacific/Norfolk"));
    String todayString = today.format(dateFormatter);
    System.out.println("Today is " + todayString);
    Assert.assertEquals("Today " + todayString, dateOnWebpage);

同样,即使模式中有一个M 和一个d,如果月份或日期大于9,则会打印两位数。format 方法还能做什么?如果您始终需要两位数的月份日期,请将dd 放入格式模式字符串中。

请在两个 sn-ps 中填写您希望的时区,我将太平洋/诺福克放在其中,因为全球各地的日期永远不会相同。

我正在使用并推荐 java.time,这是现代 Java 日期和时间 API。 DateFormatSimpleDateFormat 不仅已经过时了,而且出了名的麻烦。 Date 已经过时了。我会完全避免这些课程。现代 API 通常更易于使用。

链接:Oracle tutorial: Date Time解释如何使用java.time

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2018-09-04
    • 1970-01-01
    • 2011-12-30
    相关资源
    最近更新 更多