Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SeleniumWebDriver/Java:处理日历_Java_Selenium_Selenium Webdriver - Fatal编程技术网

SeleniumWebDriver/Java:处理日历

SeleniumWebDriver/Java:处理日历,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我是硒的新手。我正在尝试处理一个网站日历 当我运行下面显示的代码时,它返回“日期不匹配”(else分支)。当我使用contains函数而不是equalsignorecase时,它选择的是12th日期,而不是31 我尝试自动测试的网站是。有人能帮忙吗 public void logged_in_user_booking()引发中断异常 { 日历。单击(); 睡眠(4000); 列表日期=driver.findElements(按.cssSelector(“.days”); 系统输出打印项次(日期

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

当我运行下面显示的代码时,它返回
“日期不匹配”
else
分支)。当我使用
contains
函数而不是
equalsignorecase
时,它选择的是
12
th日期,而不是
31

我尝试自动测试的网站是。有人能帮忙吗


public void logged_in_user_booking()引发中断异常
{
日历。单击();
睡眠(4000);
列表日期=driver.findElements(按.cssSelector(“.days”);
系统输出打印项次(日期);

对于(int i=0;iOK,所以我们一致认为,简单/快速的解决方法是获得
  • 日期
    网页元素的完整列表(例如:天):
    列表日期=驱动程序.findElements(By.cssSelector(“ul.days li”);

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

    问题:从日历小部件中选择最后日期

    您的解决方案:在日历的日期
    WebElements
    中循环,查找包含最后一天的日期(例如:
    31

    最佳解决方案:使用一个更适合此场景的,因为它消除了遍历整个月日列表的需要

    因此,我们的xpath选择器应该是:
    /ul[contains(@class,“days”)]/li/span[text()=31]
    。下面是我如何使用浏览器控制台获得该结果的一个分步分解

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

    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();
    }
    
    public void logged_in_user_booking()引发中断异常
    {
    日历。单击();
    睡眠(4000);
    List lastDay=driver.findelelements(By.xpath(//ul[contains(@class,“days”)]]/li/span[text()=31]);
    单击();
    }
    
    看起来好多了,对吧?!:)

    下一步:现在您知道如何使用xpath基于文本定位特定元素,您可以微调程序以检查异常:
    28
    30
    ,等等


    希望对您有所帮助。干杯!

    既然您正在学习硒,我建议您做几件事:

  • 当您编写可能会被重用的代码时,请编写一个函数。在这样的网站上选择一天是您可能会反复使用的。想想页面上可能会重复哪些操作,并为每个操作编写函数。在这个简单的例子中,我会将一天作为
    字符串
    ,然后单击相应的一天

    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();
    }
    
    就像

    driver.get("https://www.dineout.co.in/delhi/boa-village-civil-lines-north-delhi-21335");
    setDay("31");
    
  • 不要使用
    Thread.Sleep()
    。我不会详细讨论所有细节,因为通过谷歌搜索,你会找到很多理由,但这是一种糟糕的做法。相反,使用显式等待,
    WebDriverWait
    。查看
    ExpectedConditions
    ,查看所有可以等待的不同内置内容,并在需要时使用它。有时你必须聪明点你在等待什么,但几乎总是有东西

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

  • 对于奖励积分…请将函数重写为:

  • 获取
    日期
    参数
  • 拉出日期、月份和年份
  • 并选择正确的日期

  • 它应该能够从不同的年/月中选择一个月。

    您希望结果是什么?您当前的选择器仅返回1个
    WebElement
    。您要查找的是
    列表日期=driver.findElements(By.cssSelector(“ul.days li”))
    。此外,以下步骤也会出现一些问题。顺便说一句,您的逻辑也必须改变:如果您的月份有
    !=31天,您将怎么办?:)非常感谢您,它现在可以工作了。如果!=31,我将选择其他30天(2月28日)@iamdanchiv。我刚开始使用selenium,我现在正在练习。很高兴它能起作用。是的,你可以尝试使用
    开关
    语句来处理你的异常。但是,最终,你只是尝试在月的最后一天单击,对吗?有更好的方法来实现这一点。干杯!@iamdanchiv:是的,我现在读了。谢谢你的支持帮帮兄弟:)。我现在已经解决了这个问题
    
    driver.get("https://www.dineout.co.in/delhi/boa-village-civil-lines-north-delhi-21335");
    setDay("31");