如何使用 RSelenium 从阴影 DOM 中的元素 ID 创建可点击的 webElement?

How do I create a clickable webElement from an elementID in a shadow DOM using RSelenium?

我正在尝试从此 GIS 下载数据 site,但我需要的一些按钮元素在阴影中 dom。

我的策略是 运行 一个 JS 脚本,该脚本使用 shadowRoot.querySelector 获取“elementID”并用它指向我需要单击的按钮。我以为我可以使用 RSelenium::webElement 来创建按钮元素,但是当我尝试点击它们时出现错误。

pacman::p_load(RSelenium, glue, dplyr, rvest)

driver <- rsDriver(browser = c("chrome"), chromever = "90.0.4430.24")
chrome <- driver$client

wisc_url <- "https://data.dhsgis.wi.gov/datasets/wi-dhs::covid-19-historical-data-by-county/about"

chrome$navigate(url = wisc_url)
Sys.sleep(5)

# open side panel
wisc_dl_panel_button <- chrome$findElement("css selector", "#main-region > div.content-hero > div.content-hero-footer > div.content-footer.flex-row > div.content-footer-right > div.yielded > button")
wisc_dl_panel_button$clickElement()
# sometimes it needs time to create the file
Sys.sleep(120)

# get elementId from shadow DOM
wisc_dlopts_elt_id <- chrome$executeScript("return document.querySelector('hub-download-card').shadowRoot.querySelector('calcite-card').querySelector('calcite-dropdown')")[[1]]
wisc_dlopts_elt <- webElement(elementId = wisc_dlopts_elt_id,
                              browserName = "chrome",
                              port = 4567)
wisc_dlopts_elt$clickElement()

## Error in checkError(res) : 
##  Undefined error in httr call. httr output: length(url) == 1 is not TRUE

我不认为这是我正在使用的特定 elementID。我尝试将此 create-webElement 方法与其他可以使用典型 findElement >> clickElement 方法单击的元素一起尝试,但我仍然遇到相同的错误。

顺便说一句,我可以通过 JS 脚本解决这个特殊问题。但是我不太了解 JS,所以我宁愿有一个 RSelenium 解决方案,如果将来出现不同的用例,我可以更普遍地应用它。

您尝试使用 findElements 了吗?

如果您获得 CSS 或 Xpath,您可以尝试类似的操作:

frames <- remDr$findElements("css selector", 'your_css')

然后

frames[[1]]$clickElement()

这就是我通常做的..

使用 shadowr 包中的 find_elements

library(shadowr)
remDr <- RSelenium::remoteDriver(
  remoteServerAddr = "host.docker.internal",
  port = 4445 , browser = "chrome")
remDr$open(silent = TRUE)

wisc_url <- "https://data.dhsgis.wi.gov/datasets/wi-dhs::covid-19-vaccination-data-by-county/explore?location=44.718554%2C-89.846850%2C7.23"
remDr$navigate(url = wisc_url)
Sys.sleep(5)

shadow_rd <- shadow(remDr)

wisc_dl_panel_button <- find_elements(shadow_rd, 'button[aria-describedby*="tooltip"]')
wisc_dl_panel_button[[3]]$clickElement()

wisc_dl_panel_button <- find_elements(shadow_rd, 'calcite-button')
wisc_dl_panel_button[[1]]$clickElement()

有关详细信息和示例,请查看我的 github 页面 https://github.com/ricilandolt/shadowr and https://www.shadowr.org/(披露:我是该软件包的贡献者)。