Author: Winston Chang
Date: 2017-11-29

# An Introduction to the webshot Package

#### Winston Chang

#### 2017-11-29

The webshot package makes it easy to take screenshots of web pages from R. It requires an installation of the external program PhantomJS (you may use `webshot::install_phantomjs()` to install PhantomJS, if you do not want to download the binary and put it in `PATH` manually).

The main function in this package is `webshot()`. Below are some examples of taking screenshots of the website http://rstudio.github.io/leaflet/:

    library(webshot)
    URL <- "http://rstudio.github.io/leaflet/"
    # Might need a longer delay for all assets to display
    webshot(URL, delay = 0.5)

    # Clip to the viewport
    webshot(URL, cliprect = "viewport")

    # Manual clipping rectangle
    webshot(URL, cliprect = c(200, 5, 400, 300))

    # Using CSS selectors to pick out regions
    webshot(URL, selector = ".list-group")

    webshot(URL, selector = c("#features", "#installation"))

    # Expand selection region
    webshot(URL, selector = "#installation", expand = c(10, 50, 0, 50))

    # If multiple matches for a given selector, it uses the first match
    webshot(URL, selector = "p")

    webshot("https://github.com/rstudio/shiny/", selector = "ul.numbers-summary")

If you are familiar with JavaScript, you may run some JavaScript code on the page before taking the screenshot. Here is an example of logging into reddit:

    # Send commands to eval
    webshot("http://www.reddit.com/", "reddit-input.png",
      selector = c("#search", "#login_login-main"),
      eval = "casper.then(function() {
        // Check the remember me box
        this.click('#rem-login-main');
        // Enter username and password
        this.sendKeys('#login_login-main input[type=\"text\"]', 'my_username');
        this.sendKeys('#login_login-main input[type=\"password\"]', 'password');

        // Now click in the search box. This results in a box expanding below
        this.click('#search input[type=\"text\"]');
        // Wait 500ms
        this.wait(500);
      });"
    )

You can also take screenshots of Shiny apps using the `appshot()` function, e.g.

    appdir <- system.file("examples", "01_hello", package="shiny")
    appshot(appdir, delay = 3)

There are two functions `resize()` and `shrink()` to manipulate images, which require GraphicsMagick (or ImageMagick) and OptiPNG, respectively. A simple example:

    # Result can be piped to other commands like resize() and shrink()
    webshot("https://www.r-project.org/", "r-small.png") %>%
     resize("75%") %>%
     shrink()