Telerik(Kendo)日期选择器pickDay方法选指定日期异常求助
我之前也碰到过类似的Telerik日历组件自动化问题,结合你给出的代码和场景,咱们一步步来排查修复:
首先梳理下核心问题:传入06/04/2019(6月4日),控制台打印date[DAY_OF_MONTH]输出4,但实际选中的却是1号。下面是几个高概率的原因和对应的解决方案:
1. 修复Calendar常量的引用问题
你的代码里直接用了DAY_OF_MONTH,但如果没有显式导入java.util.Calendar类,Groovy对这个常量的解析可能出现隐性异常,导致传递给测试对象的数值并非预期的4。
修复步骤:
- 在
RadDatePicker类顶部添加导入语句:
import java.util.Calendar
- 修改
pickDay方法里的日期获取逻辑,确保正确拿到日份:
def pickDay() { def targetDay = date.get(Calendar.DAY_OF_MONTH) println targetDay WebUI.click(findTestObject('Object Repository/Telerik/RadDateLightWeightPage/a_dayPicker', [('day') : targetDay])) }
2. 修正测试对象a_dayPicker的定位器
Telerik(Kendo)的日期按钮通常带有data-day属性(比如<a data-day="4" class="k-link">4</a>),如果你的测试对象用了文本模糊匹配(比如//a[contains(text(), '{day}')]),很容易误匹配到包含相同数字的其他日期,或者在切换月份后点击到未更新的旧元素。
修复步骤:
- 打开测试对象
a_dayPicker,把定位器改成基于data-day属性的精确匹配:
//a[@data-day='{day}']
如果必须用文本匹配,一定要用精确匹配的表达式:
//a[text()='{day}']
3. 规范Date解析的写法(避免潜在坑)
你的代码里用了new Date().parse("MM/dd/yyyy", input_date),虽然功能上可能暂时正常,但parse是Date类的静态方法,正确写法应该直接调用静态方法,避免创建多余的Date对象:
date = Date.parse("MM/dd/yyyy", input_date)
同样,displayDate()方法里的解析也需要修正:
def displayDate() { return Date.parse("MMM/yyyy", displayMonth() + "/" + displayYear()) }
4. 添加元素等待确保日历加载完成
切换年份和月份后,日历组件需要一点时间更新日期列表,如果直接点击,很可能会点击到未更新的旧元素(比如上一个月份的1号)。
修复步骤:
在pickDay方法中加入等待逻辑,确保目标日期元素可见后再点击:
def pickDay() { def targetDay = date.get(Calendar.DAY_OF_MONTH) def dayElement = findTestObject('Object Repository/Telerik/RadDateLightWeightPage/a_dayPicker', [('day') : targetDay]) // 等待元素可见,超时时间设置为10秒 WebUI.waitForElementVisible(dayElement, 10) println targetDay WebUI.click(dayElement) }
额外验证点
记得确认displayMonth()和displayYear()方法返回的是日历当前显示的月份和年份,确保切换月份/年份的逻辑正确,避免日历停留在错误的月份(比如停留在5月,而5月的4日不可见,导致代码默认点击了1号)。
内容的提问来源于stack exchange,提问作者jikim01

