Loading a page reliably

library(chromote)
b <- ChromoteSession$new()

In many cases, the commands Page$navigate() and then $Page$loadEventFired() will not reliably block until the page loads. For example:

# Not reliable
b$Page$navigate("https://www.r-project.org/")
b$Page$loadEventFired()  # Block until page has loaded

This is because the browser might successfully navigate to the page before it receives the loadEventFired command from R.

In order to navigate to a page reliably, you must issue the loadEventFired command first in async mode, then issue the navigate command, and then wait for the loadEventFired promise to resolve. (If it has already resolved at this point, then the code will continue.)

# Reliable method 1: for use with synchronous API
p <- b$Page$loadEventFired(wait_ = FALSE)  # Get the promise for the loadEventFired
b$Page$navigate("https://www.r-project.org/", wait_ = FALSE)

# Block until p resolves
b$wait_for(p)

# Add more synchronous commands here
b$screenshot("browser.png")

The above code uses the async API to do the waiting, but then assumes that you want to write subsequent code with the synchronous API.

If you want to go fully async, then instead of calling wait_for(p), you would simply chain more promises from p, using $then().

# Reliable method 2: for use with asynchronous API
p <- b$Page$loadEventFired(wait_ = FALSE)  # Get the promise for the loadEventFired
b$Page$navigate("https://www.r-project.org/", wait_ = FALSE)

# Chain more async commands after the page has loaded
p$then(function(value) {
  b$screenshot("browser.png", wait_ = FALSE)
})

This is explained in more detail in vignette("sync-async").