在不更改页面的情况下使用 RSelenium 缩小网站 size/resolution

Zoom out of website when using RSelenium without changing page size/resolution

我想缩小 RSelenium 远程,但要找到解决方案出奇地困难。 我知道

library(RSelenium)
driver <- rsDriver()
remDr <- driver[["client"]]
remDr$navigate("https://www.google.com/")
webElem <- remDr$findElement("css", "html")
webElem$sendKeysToElement(list(key = "control", "-"))              ## Does not work
webElem$sendKeysToElement(list(key = "control", key = "subtract")) ## Does not work

浏览器是Chrome。

我认为问题不在于将密钥发送到浏览器,因为如链接帖子中所述,可以将 control + a 发送到浏览器 window 到 select 元素。似乎这些键没有被识别为浏览器的命令 application.

不过,还有其他方法可以解决这个问题。

正如@Muzzamil 所建议的,您可以通过使用 Chrome 更改文档正文的 css 来获得类似的效果,尽管这在 Firefox 中不起作用。

如果您想以一种在整个会话期间持续存在的方式本机更改浏览器缩放,我可以演示使用 Firefox 和 Chrome 的解决方案,因为在这两种情况下都可以导航到 html -based 选项页面并与之交互以设置浏览器缩放级别。

以下是使用 Firefox 的方法:

library(RSelenium)

zoom_firefox <- function(client, percent)
{
  store_page <- client$getCurrentUrl()[[1]]
  client$navigate("about:preferences")
  webElem <- client$findElement("css", "#defaultZoom")
  webElem$clickElement()
  webElem$sendKeysToElement(list(as.character(percent)))
  webElem$sendKeysToElement(list(key = "return"))
  client$navigate(store_page)
}

这允许以下内容:

driver <- rsDriver(browser = "firefox")
client <- driver$client
client$navigate("https://www.google.com")
client$screenshot(display = TRUE)

我们可以看到设置了默认缩放 (100%):

现在我们像这样缩小到 50%:

zoom_firefox(client, 50)
client$screenshot(display = TRUE)

然后像这样放大:

zoom_firefox(client, 100)
client$screenshot(display = TRUE)

Chrome 更难,因为它的选项页面使用复杂的嵌套阴影 DOM。由于我们无法获得 xpath 或 css select 或导航阴影 dom,我们需要使用 javascript 提取元素的 webdriver id,然后将此 Id 强制到然后我们可以控制的另一个网络元素。

zoom_chrome <- function(client, percent)
{
  store_page <- client$getCurrentUrl()[[1]]
  client$navigate("chrome://settings/")
  webElemId <- client$executeScript(paste0("return document.querySelector",
                                           "(\"body > settings-ui\").",
                                           "shadowRoot.querySelector(\"#main\")",
                                           ".shadowRoot.querySelector",
                                           "(\"settings-basic-page\")",
                                           ".shadowRoot.querySelector",
                                           "(\"#basicPage > ",
                                           "settings-section:nth-child(8)",
                                           "> settings-appearance-page\")",
                                           ".shadowRoot.querySelector",
                                           "(\"#zoomLevel\");"),
                                    args = list("dummy"))
  webElem <- client$findElement("css", "html")
  webElem@.xData$elementId <- as.character(webElemId)
  webElem$clickElement()
  webElem$sendKeysToElement(list("3"))
  zooms <- c(25, 33, 50, 67, 75, 8:11 * 10, 125, 150, 175, 200, 250, 3:5 * 100)
  desired_zoom <- which.min(abs(percent - zooms))
  current_zoom <- which(zooms == 300)
  n_keys <- desired_zoom - current_zoom
  if(n_keys > 0) 
    for(i in seq(n_keys)) 
      webElem$sendKeysToElement(list(key = "down_arrow"))
  if(n_keys < 0) 
    for(i in seq(abs(n_keys))) 
      webElem$sendKeysToElement(list(key = "up_arrow")) 
  webElem$sendKeysToElement(list(as.character(percent)))
  webElem$sendKeysToElement(list(key = "return"))
  client$navigate(store_page)
}

但它的工作原理是一样的:

driver <- rsDriver(browser = "chrome", chromever = "80.0.3987.106")
client <- driver$client
client$navigate("https://www.google.com")
client$screenshot(display = TRUE)
zoom_chrome(client, 50)
client$screenshot(display = TRUE)
zoom_chrome(client, 100)
client$screenshot(display = TRUE)

它给出的结果与 firefox 完全相同。

当然,您可以轻松编写一个简单的包装函数,select根据当前浏览器调用 "zoom" 函数。

我没有考虑在 Internet Explorer 或 phantomjs 中实现这个,因为它们没有基于 html 的选项页面。

您可以尝试使用 Java script 缩小。请尝试以下代码以缩小 90%。

library(RSelenium)
driver <- rsDriver()
remDr <- driver[["client"]]
remDr$navigate("https://www.google.com/")
webElem <- remDr$findElement("css", "html")
script <- "document.body.style.zoom='90%'" 
remDr$executeScript(script, args = list())