如何使用 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/(披露:我是该软件包的贡献者)。
我正在尝试从此 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/(披露:我是该软件包的贡献者)。