题目要求的是指令,但是为了方便展示,我还是写成应用(其实主要是丢在指令集里,自己又不用,又舍不得删)。





如果做成指令,实际上就是我做日期输入对话框的地方弄成参数就好。
1.日期输入部分。
这个其实没什么特别的,就是加一个判断,结束日期不能早于开始日期。
我测试的日期有三组。
2018/12/09~2023/02/01
2018/12/09~2018/12/19
2018/12/09~2018/12/09
演示视频里是第一组,测试基本上所有需要点击的功能,年代、年、月、日。
第二个组,如果结束日期和开始日期是同一个月,那么点击日期是在左侧日期选择框操作。
第三组,测试开始日期和结束日期相同,xpath捕获之类的,会不会异常,因为选中的class会改变。
2.日期选择框
2.1 日期选择框选中
//a[text()='选择时间段']/preceding-sibling::*[1]
这个本来很简单不需要额外讲的。
开始觉得,//input[@placeholder="开始日期"],也可以捕获。
但是实际上日期选择框打开后就有两个开始日期的文字。
最终选择用'选择时间段',会更稳定。
2.2 开始日期选择
2.2.1 年份选择
(//*[@title="选择年份"])[1]
判断数值是否和开始日期的年份相同,不同就点开。
需要注意的是,判断相同的时候加上'年'
2.2.2 年代选择
//*[@title="选择年代"]
年代的判断上,是判断头三个字字符相同,就说明相同。
不同就点开。
2.2.3 年代点击
在年代不相同的情况下,将文字拼接匹配,比如2018重新拼接成'2010-2019'
//*[@class="ant-calendar-decade-panel-decade" and text()='变量' ]
然后匹配点击
2.2.4 年份点击
//*[@class="ant-calendar-year-panel-year" and text()='变量' ]
2.2.5 月份选择
(//*[@title="选择月份"])[1]
类似于年份判断的逻辑
2.2.6 月份点击
这里需要拿一个数组
['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月']
匹配出开始日期的月份。
//*[@class="ant-calendar-month-panel-month" and text()="变量"]
然后匹配点击
2.2.7 日子点击
日子就无所谓判断,因为这时候不需要返回上一级去选择。
(//tbody[@class="ant-calendar-tbody"])[1]/tr/td[not(contains(@class,"-month-"))]/div[@class="ant-calendar-date" and text()="变量" ]
配中点击就完事
2.3 结束日期的选择
大体上和开始日期差不多,把一些xpath里的1改成2复制下就好。
逻辑上是可以封装复用代码,但是就两个,封装复用的意义很低。
2.3.1 结束日期和开始日期同年月
我代码里是用2.2.1 年份选择和2.2.5 月份选择里的数值和结束日期匹配。
其实也可以直接开始日期和结束日期匹配,效率上这个更优。
2.3.2 普通结束日期
像选择年份就得改xpath
(//*[@title="选择年份"])[2]
但是点击年份就没意义
//*[@class="ant-calendar-year-panel-year" and text()='变量' ]
因为同一个时间只有一个。
差不多就是xpath里有[1]的全部改[2]就好。
---------------------------------------------
这个方式的优点在于面对极端的情况,点击的次数下限可以保障。
但是如果面对一些特殊情况,明显左右按钮之类其他方法更优。
特别是,2019年12月时候,点到2020年1月 3日
1.我的模式下,由于2020年和2019年不属于一个年代,要从年代开始重新选择
2.如果是左右点月份的模式,向右点一次就可以
3.如果点虚化按钮的方式,直接在当前页,点最下方的3就可以,因为本月实际上可以点上个月和下个月的部分按钮
严格意义上应该三种模式做最优情况的拆分,然后每种情况都得写。
不过代码太复杂了,特别是哪些情况最优的区分做思维导图有点烦,我抛砖引玉下,就不写了。
OK,如上就是我的整个思路逻辑。欢迎讨论交流。