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");