https://github.com/rstudio/webdriver
WebDriver client in R
https://github.com/rstudio/webdriver
Last synced: 7 months ago
JSON representation
WebDriver client in R
- Host: GitHub
- URL: https://github.com/rstudio/webdriver
- Owner: rstudio
- License: other
- Created: 2016-08-18T11:20:46.000Z (about 9 years ago)
- Default Branch: main
- Last Pushed: 2022-06-10T20:44:17.000Z (over 3 years ago)
- Last Synced: 2024-06-11T18:14:49.658Z (over 1 year ago)
- Language: R
- Homepage: https://rstudio.github.io/webdriver/
- Size: 1.82 MB
- Stars: 68
- Watchers: 10
- Forks: 17
- Open Issues: 27
-
Metadata Files:
- Readme: README.Rmd
- License: LICENSE
Awesome Lists containing this project
- jimsghstars - rstudio/webdriver - WebDriver client in R (R)
README
---
output: github_document
---
```{r, setup, echo = FALSE, message = FALSE}
knitr::opts_chunk$set(
tidy = FALSE,
fig.width = 4,
fig.height = 12,
fig.path = "man/figures")
```
```{r screenshot-manual, eval = FALSE, include = FALSE}
# Run this code to update the images (since results are random)
pjs <- webdriver::run_phantomjs()
ses <- Session$new(port = pjs$port)
ses$go("https://r-pkg.org/pkg/callr")
ses$takeScreenshot(file="man/figures/screenshot-1.png")
search <- ses$findElement("#cran-input")
search$sendKeys("html", key$enter)
ses$takeScreenshot(file="man/figures/screenshot-2.png")
```
# webdriver
> 'WebDriver' Client for 'PhantomJS'
[](https://github.com/rstudio/webdriver/actions)
[](https://www.r-pkg.org/pkg/webdriver)
[](https://www.r-pkg.org/pkg/webdriver)
[](https://codecov.io/github/rstudio/webdriver?branch=main)
A client for the 'WebDriver' 'API'. It allows driving a (probably headless)
web browser, and can be used to test web applications, including 'Shiny'
apps. In theory it works with any 'WebDriver' implementation, but it was only
tested with 'PhantomJS'.
## Installation
```r
install.packages("webdriver")
```
## Usage
```{r}
library(webdriver)
```
### PhantomJS
webdriver uses PhantomJS as a headless web browser. (In theory in works
with other WebDriver clients as well.) You can use the `install_phantomjs()`
function to download and install PhantomJS on your system. Alternatively
an installation that is in the PATH is sufficient.
The `run_phantomjs()` function starts PhantomJS, and waits until it is ready
to serve queries. It returns a process object that you can terminate
manually, and the port on which PhantomJS is listening.
```{r, results='hide'}
pjs <- run_phantomjs()
pjs
```
## $process
## PROCESS 'phantomjs', running, pid 17405.
##
## $port
## [1] 6795
### Sessions
Use the `Session` class to connection to a running PhantomJS process.
One process can save multiple sessions, and the sessions are independent
of each other.
```{r}
ses <- Session$new(port = pjs$port)
```
Once a session is established, you can manipulate the headless web browser
through it:
```{r}
ses$go("https://r-pkg.org/pkg/callr")
ses$getUrl()
ses$getTitle()
```
You can also take a screenshot of the whole web page, and show it on R's
graphics device, or save it to a PNG file:
```{r screenshot-1, eval = FALSE}
ses$takeScreenshot()
```

### HTML elements
The `Session` object has two methods to find HTML elements on the current
web page, which can then be further manipulated: `findElement()` and
`findElements()`. They work with CSS or XPATH selectors, and also with
(possibly partial) HTML text.
```{r}
install <- ses$findElement(".install-package")
install$getName()
install$getText()
```
If you have an HTML element that can receive keyboard keys, you can use
the `sendKeys()` method to send them. The `key` list helps with sending
special, characters, e.g. `key$enter` corresponds to pressing ENTER. For
example we can type into a search box:
```{r}
search <- ses$findElement("#cran-input")
search$sendKeys("html", key$enter)
ses$getUrl()
ses$getTitle()
```
```{r screenshot-2, eval = FALSE}
ses$takeScreenshot()
```

### JavaScript
The `executeScript()` method of a `Session` object runs arbitrary JavaScript
in the headless browser. It puts the supplied code into the body of a
JavaScript function, and the function will receive the additional arguments,
in its `arguments` array. `Element` objects as arguments are automatically
converted to the corresponding DOM elements in the browser.
The JavaScript function can return values to R. Returned HTML elements are
automatically converted to `Element` objects.
```{r}
ses$executeScript("return 42 + 'foobar';")
```
```{r}
search2 <- ses$executeScript("return document.getElementById('cran-input');")
search2$getName()
```
`Element` objects also have an `executeScript()` method, which works the
same way as the `Session` method, but it automatically supplies the HTML
element as the first argument of the JavaScript function.
`executeScript()` works synchronously. If you need asynchronous execution,
you can use the `executeScriptAsync()` function.
## License
MIT © Mango Solutions, RStudio