【问题标题】:How to access WebElement from executeScript in RSelenium?如何从 RSelenium 中的 executeScript 访问 WebElement?
【发布时间】:2022-11-09 20:32:40
【问题描述】:

我想从这个有 shadow-dom 的网站中提取数据。我想我已经设法使用 JavaScript 访问了 shadow-dom 内的元素,但我还没有弄清楚如何将 JavaScript 的返回值用作 WebElements 以便我可以处理数据。

library(RSelenium)

rD <- rsDriver(browser="firefox", port=4547L, verbose=F)
remDr <- rD[["client"]]

remDr$navigate("https://www.transfermarkt.us")

## run script to enable dropdown list in the website. This creates a <ul> tag in the shadow-dom which lists all items in the dropdown list.
remDr$executeScript("return document.querySelector('tm-quick-select-bar').setAttribute('dropdown-visible', 'countries')")
Sys.sleep(5)

这只是包含 shadow-dom 的部分。我不确定这是否是必需的,但这是下拉列表存在的地方

wrapper <- remDr$findElement(using="tag name", value="tm-quick-select-bar")

下面是访问下拉列表的脚本

script <- 'return document.querySelector("#main > header > div.quick-select-wrapper > tm-quick-select-bar").shadowRoot.querySelector("div > tm-quick-select:nth-child(2) > div > div.selector-dropdown > ul");'

test <- remDr$executeScript('return document.querySelector("#main > header > div.quick-select-wrapper > tm-quick-select-bar").shadowRoot.querySelector("div > tm-quick-select:nth-child(2) > div > div.selector-dropdown > ul");', list(wrapper))

这将返回以下列表。

> test                                                                                    
$`element-6066-11e4-a52e-4f735466cecf`                                                    
[1] "4adac8f8-2c94-4e48-b7a3-521eb961ef8c"  

我不知道如何从中提取项目。它看起来不像是一个 WebElement。这个列表是什么,它包含什么信息?我怎样才能提取它?

我试过这个

lapply(test, function(x){
    x$getElementText()
    x[[1]]$getElementText()
})

但是,它返回错误:

Error in x$getElementText : $ operator is invalid for atomic vectors      

【问题讨论】:

  • 我不确定您要访问哪个下拉列表。是默认为 US 的国家选择器吗?

标签: r selenium rselenium


【解决方案1】:

不确定 selenium 是否可以处理影子 DOM,有一个 plugin here 据说可以解决 java 的问题。 不过,您可以提取 innerHTML 并使用 rvest 管理它

library(RSelenium)

rD <- rsDriver(browser="chrome", port=4547L, verbose=F, chromever="106.0.5249.21")
remDr <- rD[["client"]]

remDr$navigate("https://www.transfermarkt.us")

## run script to enable dropdown list in the website. This creates a <ul> tag in the shadow-dom which lists all items in the dropdown list.
remDr$executeScript("return document.querySelector('tm-quick-select-bar').setAttribute('dropdown-visible', 'countries')")
Sys.sleep(5)


wrapper <- remDr$findElement(using="tag name", value="tm-quick-select-bar")

script <- paste0(
  'return document.querySelector("#main > header > div.quick-select-wrapper > tm-quick-select-bar")',
  '.shadowRoot.querySelector("div > tm-quick-select:nth-child(2) > div > div.selector-dropdown > ul")'
  '.innerHTML;')

test <- remDr$executeScript(script)

html <- rvest::read_html(test[[1]])

rvest::html_text(html)

# " Afghanistan Albania Algeria American Samoa American .....

【讨论】:

  • 是的!!!这就是我要找的。所以,我只是想念.innerHTML
【解决方案2】:

我不知道 R,但例如:

let shadowEls = [...document.querySelectorAll('*')].filter(el => el.shadowRoot)
return shadowEls[0].shadowRoot.innerHTML

这应该足以弄清楚这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多