如何获取网页某个元素在「屏幕可见部分」的中心坐标?| 影刀RPA懒加载坐标定位技巧

做网页数据采集时,经常会遇到懒加载的列表区域。

通常我们都需要将鼠标先定位到该区域上,才能确保滚动操作始终作用在该区域,由此实现新数据的加载。

但这里有一个问题,并不是所有网页的懒加载区域,都能很好地进行坐标定位。

如果目标懒加载区域恰好是整个页面唯一的滚动区域,占据屏幕绝大部分空间,那么我们直接用"获取屏幕分辨率"加"滚动鼠标滚轮"两条指令,基本都能生效。

但实际场景中,还有些页面的懒加载区域并不在屏幕中央,比如多区域滚动、分栏页面、后台系统、嵌套滚动、小容器列表等,之前的方法就不能用了。

这时候鼠标落错了地方,滚动就作用到别的区域去了。所以,必须获取目标元素坐标再滚动。

问题来了,如何获取到网页任一元素在当前屏幕可视区域内的中心坐标位置,使得后续滚动仅发生在该区域呢?

可能不少人第一个念头是用影刀的原生指令获取元素位置,那么它在这个场景下确实能直接用吗?

并不能。该指令提供了基于"屏幕左上角"和基于"浏览器页面"左上角两种坐标系来得到坐标信息,但它们都是基于整个元素的中心,无论元素是否在当前屏幕完整可见。

这就会导致,你得到的坐标直接跑到屏幕外面去了,或者位置压根不在元素的可见区域内。

而我们要的是该区域可见部分的中心,只计算当前在屏幕内的那部分。怎么解决呢?直接上我实测后的JS脚本。

function (element,
input) {
    var rect =
element.getBoundingClientRect();
    var viewportHeight
= window.innerHeight || document.documentElement.clientHeight;
    var viewportWidth
= window.innerWidth || document.documentElement.clientWidth;
 
    // 用宽度计算实际缩放因子(不受工具栏影响)
    var scale
= window.outerWidth / window.innerWidth;
 
    // 计算元素在可视区域内的可见部分
    var visibleTop
= Math.max(0, rect.top);
    var visibleBottom
= Math.min(viewportHeight, rect.bottom);
    var visibleLeft
= Math.max(0, rect.left);
    var visibleRight
= Math.min(viewportWidth, rect.right);
 
    // 计算可见部分的宽高
    var visibleWidth
= visibleRight - visibleLeft;
    var visibleHeight
= visibleBottom - visibleTop;
 
    // 如果元素完全不可见,返回null
    if (visibleWidth
<= 0 || visibleHeight <= 0) {
        return null;
    }
 
    // 计算可见部分的中心坐标(相对于视口)
    var centerX
= visibleLeft + visibleWidth / 2;
    var centerY
= visibleTop + visibleHeight / 2;
 
    // 转换为屏幕坐标
    var browserX
= window.screenX || window.screenLeft;
    var browserY
= window.screenY || window.screenTop;
 
    // 工具栏高度 = outerHeight -
innerHeight × scale
    var toolbarHeight
= window.outerHeight - window.innerHeight *
scale;
 
    // 中心坐标从CSS像素转到物理像素
    var screenX
= browserX + centerX * scale;
    var screenY
= browserY + toolbarHeight + centerY * scale;
 
    return {
        x: Math.round(screenX),
        y: Math.round(screenY),
        visibleWidth: Math.round(visibleWidth),
        visibleHeight: Math.round(visibleHeight),
        toolbarHeight: Math.round(toolbarHeight)
    };
}

核心逻辑很简单,先拿元素的边界矩形,再算出它在屏幕上的可见区域,最后算可见区域的中心坐标

这样算出来的坐标,鼠标移过去,正好落在元素的可见部分中心,后面滚动懒加载正常触发。

这个脚本经多次调整后,对浏览器缩放、系统缩放、分辨率调整全都免疫,不管你怎么折腾,坐标都准确无误。

浏览 25
收藏
3
分享
3 +1
+1
全部评论