Я не думаю, что проблема заключается в отправке ключей в браузер, поскольку, как отмечено в связанных сообщениях, можно отправить 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%):
Теперь мы уменьшаем до 50% следующим образом:
zoom_firefox(client, 50)
client$screenshot(display = TRUE)
И увеличьте масштаб следующим образом:
zoom_firefox(client, 100)
client$screenshot(display = TRUE)
С * 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. стр.