chrome-reactive-kotlin is a low level Chrome DevTools Protocol client written in Kotlin and leveraging RxJava2 for easy composability.
Library exposes all protocol domains in a single, cohesive and highly composable API. It supports both headless and standalone Chrome versions and understands BrowserContext from Target domain.
For debugging purposes you can use my other project: chrome-protocol-proxy.
Please note that most up-to-date protocol is used at the moment.
Add to your Kotlin or Java project (Gradle dependency):
compile group: 'pl.wendigo', name: 'chrome-reactive-kotlin', version: '0.3.+'
package pl.wendigo.chrome
import pl.wendigo.chrome.domain.page.NavigateRequest
fun main(args : Array<String>) {
val inspector = Inspector.connect("127.0.0.1:9222")
val protocol = ChromeProtocol.openSession(inspector.openedPages().firstOrError().blockingGet())
val headless = protocol.headless("about:blank", 1280, 1024).blockingGet()
println("browserContext: ${headless.browserContextId}")
println("target: ${headless.targetId}")
headless.Page.enable().blockingGet()
val event = headless.Page.navigate(NavigateRequest(url="https://serafin.tech")).flatMap{ (frameId) ->
headless.Page.frameStoppedLoading().filter {
it.frameId == frameId
}
.take(1)
.singleOrError()
}.blockingGet()
println("page loaded: $event")
}
or if you prefer fully reactive composition:
package pl.wendigo.chrome
import pl.wendigo.chrome.domain.page.NavigateRequest
fun main(args : Array<String>) {
val loaded = Inspector.connect("127.0.0.1:9222")
.openedPages()
.firstOrError()
.map(InspectablePage::connect)
.flatMap { protocol ->
protocol.headless(url = "about:blank", width = 1280, height = 1024)
}.flatMap { headlessProtocol ->
headlessProtocol.Page.enable().flatMap {
headlessProtocol.Page.navigate(NavigateRequest(url = "https://serafin.tech")).flatMap { (frameId) ->
headlessProtocol.Page.frameStoppedLoading().filter {
it.frameId == frameId
}.take(1).singleOrError()
}
}
}
println("Page was loaded ${loaded.blockingGet()}")
}