https://w3c.github.io/webdriver/webdriver-spec.html
Run your local firefox installation in marionette mode:
$ firefox --marionette 1508154717660 Marionette INFO Enabled via --marionette 1508154718454 Marionette INFO Listening on port 2828
Run geckodriver WebDriver proxy:
$ ./bin/geckodriver --connect-existing --marionette-port 2828 1508154721745 geckodriver INFO geckodriver 0.19.0 1508154721755 geckodriver INFO Listening on 127.0.0.1:4444
Use curl to control it:
$ curl -s -d '{}' http://localhost:4444/session | jq . { "value": { "sessionId": "f1c4ec02-3edc-4308-a0a8-697edd383b9a", "capabilities": { "acceptInsecureCerts": false, "browserName": "firefox", "browserVersion": "56.0", "moz:accessibilityChecks": false, "moz:headless": false, "moz:processID": 26238, "moz:profile": "/home/cweiske/.mozilla/firefox/u05dh3q4.default", "pageLoadStrategy": "normal", "platformName": "linux", "platformVersion": "4.12.3cw", "rotatable": false, "specificationLevel": 0, "timeouts": { "implicit": 0, "pageLoad": 300000, "script": 30000 } } } } $ session=f1c4ec02-3edc-4308-a0a8-697edd383b9a $ curl -s -d '{"url":"http://example.org"}' http://localhost:4444/session/$session/url | jq . { "value": {} } $ curl -s http://localhost:4444/session/$session/title | jq . { "value": "Example Domain" } $ curl -s http://localhost:4444/session/$session/url | jq . { "value": "http://example.org/" } $ curl -s -d '{"using":"xpath","value":"//h1"}' http://localhost:4444/session/$session/element | jq . { "value": { "element-6066-11e4-a52e-4f735466cecf": "4131ac8d-651c-4903-8b04-a591f4f7456f" } } $ curl -s -d '{"using":"xpath","value":"//h1"}' http://localhost:4444/session/$session/elements | jq . { "value": [ { "element-6066-11e4-a52e-4f735466cecf": "30f5c6ca-6fc5-4f23-b331-d102872b4238" } ] } $ curl -s -d '{"using":"xpath","value":"//doesnotexist"}' http://localhost:4444/session/$session/element | jq . { "value": { "error": "no such element", "message": "Unable to locate element: //doesnotexist", "stacktrace": "stack backtrace:\n 0: 0x4f388c - backtrace::backtrace::trace::h736111741fa0878e\n 1: 0x4f38c2 - backtrace::capture::Backtrace::new::h63b8a5c0787510c9\n 2: 0x442d88 - webdriver::error::WebDriverError::new::hea6d4dbf778b2b24\n 3: 0x44cecc - geckodriver::marionette::MarionetteSession::response::h98d048d51a7ee2ba\n 4: 0x42c729 - <webdriver::server::Dispatcher<T, U>>::run::hba9181b5aacf8f04\n 5: 0x402c59 - std::sys_common::backtrace::__rust_begin_short_backtrace::h19de262639927233\n 6: 0x40c065 - std::panicking::try::do_call::h6c1659fc4d01af51\n 7: 0x5e38ec - panic_unwind::__rust_maybe_catch_panic\n at /checkout/src/libpanic_unwind/lib.rs:98\n 8: 0x420d32 - <F as alloc::boxed::FnBox<A>>::call_box::h953e5f59694972c5\n 9: 0x5dc00b - alloc::boxed::{{impl}}::call_once<(),()>\n at /checkout/src/liballoc/boxed.rs:661\n - std::sys_common::thread::start_thread\n at /checkout/src/libstd/sys_common/thread.rs:21\n - std::sys::imp::thread::{{impl}}::new::thread_start\n at /checkout/src/libstd/sys/unix/thread.rs:84" } }
Install chromedriver:
$ sudo apt install chromium-chromedriver
Start chromedriver:
$ /usr/lib/chromium-browser/chromedriver Starting ChromeDriver 2.30 on port 9515 Only local connections are allowed.
Use curl to talk with chromedriver:
$ curl -s -d '{"desiredCapabilities":{"browserName":"chromium"}}' http://localhost:9515/session | jq . { "sessionId": "dafbc0093bb64659b23a4b862f3e4a7a", "status": 0, "value": { "acceptSslCerts": true, "applicationCacheEnabled": false, "browserConnectionEnabled": false, "browserName": "chrome", "chrome": { "chromedriverVersion": "2.30", "userDataDir": "/tmp/.org.chromium.Chromium.DDa2Ki" }, "cssSelectorsEnabled": true, "databaseEnabled": false, "handlesAlerts": true, "hasTouchScreen": false, "javascriptEnabled": true, "locationContextEnabled": true, "mobileEmulationEnabled": false, "nativeEvents": true, "networkConnectionEnabled": false, "pageLoadStrategy": "normal", "platform": "Linux", "rotatable": false, "setWindowRect": true, "takesHeapSnapshot": true, "takesScreenshot": true, "unexpectedAlertBehaviour": "", "version": "61.0.3163.100", "webStorageEnabled": true } } $ curl -s -d '{"url":"http://example.org"}' http://localhost:9515/session/$session/url | jq . { "sessionId": "dafbc0093bb64659b23a4b862f3e4a7a", "status": 0, "value": null } $ curl -s http://localhost:9515/session/$session/url | jq . { "sessionId": "dafbc0093bb64659b23a4b862f3e4a7a", "status": 0, "value": "http://example.org/" } $ curl -s http://localhost:9515/session/$session/title | jq . { "sessionId": "dafbc0093bb64659b23a4b862f3e4a7a", "status": 0, "value": "Example Domain" } $ curl -s -d '{"using":"xpath","value":"//h1"}' http://localhost:9515/session/$session/element | jq . { "sessionId": "dafbc0093bb64659b23a4b862f3e4a7a", "status": 0, "value": { "ELEMENT": "0.2185920045857399-1" } } $ curl -s -d '{"using":"xpath","value":"//h1"}' http://localhost:9515/session/$session/elements | jq . { "sessionId": "dafbc0093bb64659b23a4b862f3e4a7a", "status": 0, "value": [ { "ELEMENT": "0.2185920045857399-1" } ] }