r - 在不更改页面大小/分辨率的情况下使用 RSelenium 缩小网站
问题描述
我想缩小 RSelenium 遥控器,但这很难找到解决方案。我知道
- 如何使用 R 中的 RSelenium 库缩小页面?,但我不想调整页面大小或分辨率——只是缩小。
- 我考虑过同时发送
control
+substract
,但这也不太奏效。我已经查看了如何使用 RSelenium 在网页中同时按下两个键(即 control-s)?,正如 OP 所指出的那样,control
+a
有效,但control
+无效s
,随后control
+substract
也无效。 - 我还尝试了如何将 RSelenium ALT+S 中的同时键发送到 Web 驱动程序中指定的 Unicode 方法?,这也不起作用。
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
到浏览器窗口以选择元素。似乎键没有被识别为浏览器应用程序的命令。
然而,还有其他方法可以解决这个问题。
正如@Muzzamil 建议的那样,您可以通过使用 Chrome 更改文档正文的 css 来获得类似的效果,尽管这在 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)
Chrome 更难,因为它的选项页面使用复杂的嵌套影子 DOM。由于我们无法获得 xpath 或 css 选择器来导航 shadow dom,我们需要使用 javascript 提取元素的 webdriver id,然后将这个 Id 强制到另一个我们可以控制的 web 元素上。
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 完全相同的结果。
当然,您可以轻松编写一个简单的包装函数,根据当前浏览器选择要调用的“缩放”函数。
我没有考虑在 Internet Explorer 或 phantomjs 中实现这一点,因为它们没有基于 html 的选项页面。
推荐阅读
- flutter - 错误:找不到正确的提供者
在此 AdminDashboardPage 小部件上方 - nginx - nginx 不检测 ssi 注释并进行正确的替换
- firefox - 通过浏览器访问ePass2003 Auto token
- javascript - 使用 React 路由器的多个参数
- python - 从文件的信息中,如何使用 Python 获取它的“所有者”?
- android - 当用 koin 注入 UseCase 时,方法在 android 中引发了“java.lang.StackOverflowError”异常
- anylogic - 我如何遍历人口以获取我最近的代理并动态检查代理的距离?
- python - 收到错误 - AttributeError:“模块”对象没有属性“连接” - 从套接字程序导入时
- python - 应用 np.vectorize 稀疏矩阵时出现奇怪的错误
- excel - 动态命名范围 - 不同的单元格