‘WebDriver’ Client for ‘PhantomJS’
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’.
install.packages("webdriver")
library(webdriver)
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.
<- run_phantomjs()
pjs pjs
## $process
## PROCESS 'phantomjs', running, pid 45932.
##
## $port
## [1] 5793
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.
<- Session$new(port = pjs$port) ses
Once a session is established, you can manipulate the headless web browser through it:
$go("https://r-pkg.org/pkg/callr")
ses$getUrl() ses
## [1] "https://r-pkg.org/pkg/callr"
$getTitle() ses
## [1] "callr @ METACRAN"
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:
$takeScreenshot() ses
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.
<- ses$findElement(".install-package")
install $getName() install
## [1] "div"
$getText() install
## [1] "install.packages(\"callr\")"
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:
<- ses$findElement("#cran-input")
search $sendKeys("html", key$enter)
search$getUrl() ses
## [1] "https://r-pkg.org/search.html?q=html"
$getTitle() ses
## [1] "METACRAN search results"
$takeScreenshot() ses
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.
$executeScript("return 42 + 'foobar';") ses
## [1] "42foobar"
<- ses$executeScript("return document.getElementById('cran-input');")
search2 $getName() search2
## [1] "input"
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.
MIT © Mango Solutions, RStudio