Selenium Webdriver / Java:处理日历

时间:2017-07-10 17:23:43

标签: java selenium selenium-webdriver

我是Selenium的新手。我正在尝试处理网站日历。

当我运行下面显示的代码时,它会返回"date did not match"else分支)。当我使用contains函数而不是equalsignorecase时,它选择12日期而不是31

我尝试自动测试的网站是 https://www.dineout.co.in/delhi/boa-village-civil-lines-north-delhi-21335 。有人可以帮忙吗?

public void logged_in_user_booking() throws InterruptedException
{
    calender.click();
    Thread.sleep(4000);
    List<WebElement> dates= driver.findElements(By.cssSelector(".days"));

    System.out.println(dates);
    for(int i=0; i<dates.size(); i++)
    {
        datee = dates.get(i).getText();
        if(datee.equalsIgnoreCase("31"))
        {

            dates.get(i).click();
            break;
        }
        else
        {
            System.out.println("date did not match");
        }       
    }   
}

2 个答案:

答案 0 :(得分:0)

好的,所以我们同意 EASY / QUICK FIX 是为了得到<li>日期WebElement的完整列表(例如:天):{{1} }。

然而,这不是解决问题的最佳方法。学习Selenium是一种愉快的体验,特别是如果做得好的话。大多数挑战来自于理解为什么如何 时选择特定类型的选择器。

  

问题:从日历窗口小部件中选择最后一个日期。

     

您的解决方案:循环查看日历List<WebElement> dates= driver.findElements(By.cssSelector("ul.days li"));的日期并查找包含最后一天的日期(例如:WebElements)。

     

最佳解决方案:使用更适合此方案的 xpath-selector ,因为它无需迭代整个月度日期列表。

     

因此,我们的 xpath-selector 应为:31。请参阅下面的逐步分析,了解我使用浏览器控制台获得该结果的方式:

enter image description here

您的代码现在应如下所示:

//ul[contains(@class, "days")]/li/span[text() = 31]

看起来更好,对吧?! :)

后续步骤:现在您已了解如何使用xpath基于文本定位特定元素,您可以对程序进行微调以检查异常:public void logged_in_user_booking() throws InterruptedException { calender.click(); Thread.sleep(4000); List<WebElement> lastDay= driver.findElements(By.xpath("//ul[contains(@class, "days")]/li/span[text() = 31]")); lastDay.click(); } ,{{ 1}}等等。

希望它对你有所帮助。干杯!

答案 1 :(得分:0)

既然你正在学习Selenium,我会建议一些事情:

  1. 当您编写可能会被重用的代码时,请编写一个函数。在这样的网站上挑选一天是你可能会反复使用的东西。考虑可能在页面上重复哪些操作并为每个操作编写函数。在这个简单的例子中,我将以window的形式收集一天,然后点击相应的日期。

    String

    称之为

    public static void setDay(String day)
    {
        driver.findElement(By.id("calendar")).click();
        By dayLocator = By.xpath("//ul[@class='days']/li/span[.='" + day + "']");
        new WebDriverWait(driver, 3).until(ExpectedConditions.visibilityOfElementLocated(dayLocator)).click();
    }
    
  2. 不要使用driver.get("https://www.dineout.co.in/delhi/boa-village-civil-lines-north-delhi-21335"); setDay("31"); 。我不会详细介绍所有细节,因为你会通过谷歌搜索找到很多理由,但这是一个不好的做法。请改用明确的等待Thread.Sleep()。查看WebDriverWait并查看所有可以等待的内置内容,并在需要时使用它。有时你必须聪明地等待你所拥有的东西,但几乎总有一些东西。

  3. 学习CSS选择器和XPath。它们都非常强大......但更喜欢CSS选择器,因为它们更快,更好地支持。 XPath主要用于根据包含的文本查找元素,因为CSS选择器不能。

    CSS Selectors reference

    CSS Selectors tips

    Advanced CSS Selectors

  4. 奖励积分...将功能重写为:

    1. 获取ExpectedConditions参数
    2. 拉出日,月和年
    3. 并选择正确的日期
    4. 它应该能够从不同的年/月中选择一个月。