Уменьшить веб-сайт при использовании RSelenium без изменения размера / разрешения страницы - PullRequest
1 голос
/ 09 февраля 2020

Я хотел бы уменьшить дистанционное управление 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.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Вы можете попробовать уменьшить с 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())
2 голосов
/ 14 февраля 2020

Я не думаю, что проблема заключается в отправке ключей в браузер, поскольку, как отмечено в связанных сообщениях, можно отправить control + a в окно браузера для выбора элементов. Скорее всего, ключи не распознаются как команды для браузера приложение .

Однако существуют и другие способы решения этой проблемы.

Как предполагает @Muzzamil, вы можете получить аналогичный эффект, изменив css тела документа с помощью Chrome, хотя это не работает в Firefox.

Если Вы хотите изменить масштаб браузера, чтобы он сохранялся в течение сеанса, я могу продемонстрировать решения, использующие Firefox и Chrome, поскольку в обоих случаях можно перейти на страницу параметров на основе html и взаимодействовать с ней. установить уровень масштабирования браузера.

Вот как вы это делаете с 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%):

enter image description here

Теперь мы уменьшаем до 50% следующим образом:

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

enter image description here И увеличьте масштаб следующим образом:

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

enter image description here

С * 1057 сложнее, потому что его страница параметров использует сложный, вложенный теневой DOM. Поскольку мы не можем получить селекторы xpath или css для навигации по теневому домену, нам нужно извлечь идентификатор веб-драйвера элемента, используя javascript, а затем принудительно установить этот идентификатор на другой веб-элемент, которым мы затем можем управлять.

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.

Конечно, вы можете легко написать простую функцию-обертку это выбирает, какую функцию «масштабирования» вызывать в зависимости от текущего браузера.

Я не рассматривал реализацию этого в inte rnet explorer или phantom js, так как они не имеют опций html. стр.

...