编辑 - 好的,我的日历结构如下
< September 2016 >
现在我想指定一个月(2016年1月)并点击右箭头直到2016年1月
现在元素结构如下
<div class="calendar">
<h3 id="calendar-month" class="calendar-title" title="September 2016"
role="heading" aria-live="assertive" aria-atomic="true">September 2016</h3>
<table class="calendar-grid" role="grid" aria-labelledby="calendar-month">
我尝试了下面的代码,但它没有用(NB我没有使用该方法点击本例中的下个月)
public static void MonthOut(string month)
{
var nextMnthOutBtn = DriverContext.Driver.FindElement(By.XPath(".//*[@title='Go to the next month']"));
var calMonth = DriverContext.Driver.FindElement(By.ClassName("calendar"));
IList<IWebElement> allValidDates = calMonth.FindElements(By.Id("calendar-month"));
foreach (var date in allValidDates)
if (date.Text.Equals(month))
{
break;
}
}
答案 0 :(得分:0)
有几种方法可以做到这一点。
我首先要看看是否有办法可以跳到正确的月份。查看URL并查看是否有可以设置的参数,例如...?month=9&year=2016
或类似的东西。如果是,并且符合您的要求,请使用该方法。它会更快,更快。
如果你不能做#1,我会像你一样编写一个函数,但为DateTime
接受一个targetDate
参数(你需要一个月和年)。将页面上的月份/年份与目标日期进行比较,并确定是否需要单击右键+1个月或单击左侧-1个月。继续这样做直到当前月/年=目标月/年。该功能的一些示例代码如下。
public static void ChangeCalendarMonth(DateTime targetDate)
{
By currentDateLocator = By.Id("calendar-month");
By leftArrowLocator = By.Id("some locator");
By rightArrowLocator = By.Id("some locator");
// read current calendar date from page
DateTime currentDate = DateTime.Parse(Driver.FindElement(currentDateLocator).Text);
int compare = DateTime.Compare(currentDate, targetDate);
while (compare != 0)
{
if (compare < 0)
{
// click right to +1 month
Driver.FindElement(rightArrowLocator).Click();
}
else
{
// click left arrow to -1 month
Driver.FindElement(leftArrowLocator).Click();
}
// read current calendar date from page
currentDate = DateTime.Parse(Driver.FindElement(currentDateLocator).Text);
compare = DateTime.Compare(currentDate, targetDate);
}
}
然后你会称之为
DateTime targetDate = new DateTime(2017, 1, 1); // January 2017
ChangeCalendarMonth(targetDate);
注意:您需要确保始终将targetDate
天创建为1.当您从页面上抓取月份/年份并将其转换为DateTime
时将永远是第1天。如果你没有在第1天都拥有它们,你将会无限循环。