如何使用RSelenium驱动浏览器对在线地图应用执行平移操作?
问题原因
这个在线地图基于Esri ArcGIS JavaScript API开发,地图内容通过Canvas动态渲染,之前的操作逻辑存在几个核心问题:
window.scrollBy控制的是浏览器页面滚动条,和Canvas内部的地图平移逻辑完全无关,不可能触发地图移动- 你定位的
<canvas>元素只是渲染输出层,实际接收键鼠交互事件的是外层带esri-view-surface类的div容器,直接给Canvas发按键/点击事件不会被地图逻辑识别 - 方向键操作需要先让交互容器获得焦点,对应的事件才会被地图逻辑捕获
可行解决方法
方法1:模拟方向键操作(和手动操作逻辑一致)
library(RSelenium) rD <- rsDriver(browser="firefox", port = 4542L) remDr <- rD[["client"]] remDr$open() remDr$navigate("https://www.dsec.gov.mo/gis/unidade/unidade.html?lang=en") # 等待地图加载完成 Sys.sleep(3) # 定位正确的交互容器,不是canvas map_container <- remDr$findElement("css selector", "div.esri-view-surface") # 先点击容器让它获得焦点 map_container$clickElement() # 发送方向键,例如下移地图 map_container$sendKeysToElement(list(key = "down_arrow")) # 如果需要连续移动可以多次发送,或者按时间长按 for (i in 1:5) { map_container$sendKeysToElement(list(key = "right_arrow")) Sys.sleep(0.2) }
方法2:模拟鼠标拖拽平移
通过模拟鼠标按下、移动、释放的完整事件流实现拖拽,适合需要自定义平移距离的场景:
# 接上段代码,已经获取map_container # 模拟在容器中心按下左键 remDr$mouseMoveToLocation(webElement = map_container, x = 500, y = 400) remDr$buttonDown(0) # 向左上方移动200像素,对应地图向右下方平移 remDr$mouseMoveToLocation(x = 300, y = 200) # 释放左键完成平移 remDr$buttonUp(0)
方法3:直接调用ArcGIS内置API(最稳定)
不用模拟键鼠交互,直接执行JS调用地图实例的方法控制平移/缩放,不会受焦点、事件拦截影响:
# 直接执行JS代码移动地图,例如下移对应纬度偏移 remDr$executeScript(" const view = document.querySelector('div.esri-view-surface').parentElement.__esriView; view.goTo(view.center.clone().offset(0, -0.01)); // offset参数分别是经度偏移、纬度偏移,可自定义 ") # 也可以直接指定目标经纬度跳转到指定位置 remDr$executeScript(" const view = document.querySelector('div.esri-view-surface').parentElement.__esriView; view.goTo({ center: [113.55, 22.19], // 可替换为目标坐标 zoom: 15 // 缩放级别 }); ")
内容的提问来源于stack exchange,提问作者Corolla34
相关产品推荐
相关产品推荐

