我是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");
}
}
}
答案 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
。请参阅下面的逐步分析,了解我使用浏览器控制台获得该结果的方式:
您的代码现在应如下所示:
//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,我会建议一些事情:
当您编写可能会被重用的代码时,请编写一个函数。在这样的网站上挑选一天是你可能会反复使用的东西。考虑可能在页面上重复哪些操作并为每个操作编写函数。在这个简单的例子中,我将以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();
}
不要使用driver.get("https://www.dineout.co.in/delhi/boa-village-civil-lines-north-delhi-21335");
setDay("31");
。我不会详细介绍所有细节,因为你会通过谷歌搜索找到很多理由,但这是一个不好的做法。请改用明确的等待Thread.Sleep()
。查看WebDriverWait
并查看所有可以等待的内置内容,并在需要时使用它。有时你必须聪明地等待你所拥有的东西,但几乎总有一些东西。
学习CSS选择器和XPath。它们都非常强大......但更喜欢CSS选择器,因为它们更快,更好地支持。 XPath主要用于根据包含的文本查找元素,因为CSS选择器不能。
奖励积分...将功能重写为:
ExpectedConditions
参数它应该能够从不同的年/月中选择一个月。