在协助客户进行手机自动化的问题解决时,我们经常会遇到需要循环往下滑动屏幕获取信息或者点击的场景。在大多时候时候,这类场景都对精准的滑动控制有着较高的要求,我们要尽量避免出现滑过头(漏拿信息)或者没滑到位(需要进行去重)的情况。
而即使使用坐标+增加滑动时间减少屏幕滑动惯性的方式,再循环滑动几次之后,也很容易会发生偏移的情况。


上面这个gif图,即是采用坐标+增加滑动时间的方式,但是可以看到,再循环几次之后,位置就已经发生了偏移。
在我看来,这是因为两个原因导致的:
分析完问题后,我们即可得到一个假设:假如每滑动一次,就进行一次细微的调整,是不是就能保证每次的滑动都是符合预期的?
在得出这个假设之后,问题其实就简单很多了,剩下要解决的就是:我们要以什么作为参照物进行微调,每次微调的距离怎么计算?
参照物可以理解为锚点,我们要找一个相对固定的元素来作为我们每次微调的锚点,根据它的坐标来进行微调。
以下图为例,在每一个信息块中,都有XXX条视频这个文字描述,那它就很适合作为我们的锚点。我们可以获取页面第一个XXX条视频的y值坐标(420),那此时的y值420即是我们的标准值。

如果滑动后,页面第一个XXX条视频的坐标y值不等于420,我就让屏幕从它的当前y值滑动到420上去。

如此一来,我们就实现了一次细微的滑动,而这种滑动由于距离很短,会非常的准确。
那在循环滑动的过程中,每滑一次就进行微调也会使得滑动变得非常“完美”和“精准”。
这个方案的核心是找锚点和获取坐标,但由于手机自动化经常会遇到获取不到ui树无法捕获元素的情况,我这里列出一些可以获取锚点坐标的方式:
1. 【获取手机元素信息】-获取元素位置:首选,这个方法适用于捕获元素没问题的情况。
2. 【获取图像坐标】-获取列表中第一个图像的坐标:这个方法适用于无法捕获元素,但是每块信息都有一块相同的标识的情况。
3. 【屏幕截图】-【影刀离线OCR】-获取相同标识的文本的坐标:同上,适用于无法捕获元素,但是每块信息都有一块相同的标识的情况。
例如,刚刚的案例即是无法获取ui树无法捕获元素的情况,但是它的每一个信息块中都有 XXX条视频,那我们即可以用图像或ocr的方式去获取它的位置。

在这里,我用的是图像的方式👇

最后,来简单看运行效果吧~
