影刀2023终竞赛-操作题三:影刀商城日期选择自定义指令
评论
收藏

影刀2023终竞赛-操作题三:影刀商城日期选择自定义指令

经验分享
千
千里
2024-02-11 09:44·浏览量:622
千
千里
影刀见习开发者
发布于 2024-02-11 09:44622浏览

视频演示地址

公众号原文地址

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


如果做成指令,实际上就是我做日期输入对话框的地方弄成参数就好。

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,如上就是我的整个思路逻辑。欢迎讨论交流。

收藏
全部评论(1)
最新
发布评论
评论