Take a screenshot of the viewport and display it using the showimage package.
This uses Chromote’s $screenshot()
method, which wraps up
many calls to the Chrome DevTools Protocol.
b <- ChromoteSession$new()
# ==== Semi-synchronous version ====
# Run the next two lines together, without any delay in between.
p <- b$Page$loadEventFired(wait_ = FALSE)
b$Page$navigate("https://www.r-project.org/", wait_ = FALSE)
b$wait_for(p)
b$screenshot(show = TRUE) # Saves to screenshot.png and displays in viewer
# ==== Async version ====
p <- b$Page$loadEventFired(wait_ = FALSE)
b$Page$navigate("https://www.r-project.org/", wait_ = FALSE)
p$then(function(value) {
b$screenshot(show = TRUE)
})
It is also possible to use selectors to specify what to screenshot, as well as the region (“content”, “border”, “padding”, or “margin”).
# Using CSS selectors, choosing the region, and using scaling
b$screenshot("s1.png", selector = ".sidebar")
b$screenshot("s2.png", selector = ".sidebar", region = "margin")
b$screenshot("s3.png", selector = ".page", region = "margin", scale = 2)
If a vector is passed to selector
, it will take a
screenshot with a rectangle that encompasses all the DOM elements picked
out by the selectors. Similarly, if a selector picks out multiple DOM
elements, all of them will be in the screenshot region.
The default size of a ChromoteSession
viewport is 992 by
1323 pixels. You can set the width and height when it is created:
b <- ChromoteSession$new(width = 390, height = 844)
b$Page$navigate("https://www.r-project.org/")
b$screenshot("narrow.png")
With an existing ChromoteSession
, you can set the size
with b$set_viewport_size()
:
You can take a “Retina” (double) resolution screenshot by using
b$screenshot(scale=2)
:
Headless Chrome provides a remote debugging UI which you can use to
interact with the web page. The ChromoteSession’s $view()
method opens a regular browser and navigates to the remote debugging
UI.
b <- ChromoteSession$new()
b$view()
b$Page$navigate("https://www.google.com") # Or just type the URL in the navigation bar
At this point, you can interact with the web page by typing in text and clicking on things.
Then take a screenshot:
With async code, it’s possible to navigate to and take screenshots of multiple websites in parallel.
library(promises)
library(chromote)
urls <- c(
"https://www.r-project.org/",
"https://github.com/",
"https://news.ycombinator.com/"
)
screenshot_p <- function(url, filename = NULL) {
if (is.null(filename)) {
filename <- gsub("^.*://", "", url)
filename <- gsub("/", "_", filename)
filename <- gsub("\\.", "_", filename)
filename <- sub("_$", "", filename)
filename <- paste0(filename, ".png")
}
b <- ChromoteSession$new()
p <- b$Page$loadEventFired(wait_ = FALSE)
b$Page$navigate(url, wait_ = FALSE)
p$then(function(value) {
b$screenshot(filename, wait_ = FALSE)
})$
then(function(value) {
message(filename)
})$
finally(function() {
b$close()
})
}
# Screenshot multiple simultaneously
ps <- lapply(urls, screenshot_p)
pa <- promise_all(.list = ps)$then(function(value) {
message("Done!")
})
# Block the console until the screenshots finish (optional)
cm <- default_chromote_object()
cm$wait_for(pa)
#> www_r-project_org.png
#> github_com.png
#> news_ycombinator_com.png
#> Done!