web-driverify
v1.1.3
Published
A passive web driver endpoint for real browsers.
Downloads
77
Readme
web-driverify
This is a common webdriver for any browser to provide Web Driver interface. Especially useful for browsers that does NOT support Web Driver API.
Web-driverify supports most of the Web Driver Commands, and can work without browser-specific binaries.
Get Started
Install
npm i -g web-driverify
Start Server
$ wd -h
Usage: wd [options] [configFile]
Options:
-V, --version output the version number
-p, --port [num] port number [8089]
--proxy-port [num] proxy port number [8088]
--stub-port [num] stub port number for debug use [8087]
--host [hostname] hostname for the server
-h, --help output usage information
configFile
defaults to web-driverify.yaml
in currrent work directory, here's an example.
Here's a boilerplate project: https://github.com/web-driverify/wdio-boilerplate
Set
DEBUG=wd:*
to enable debug output.wd-phantom
will attach a phantomjs (one of the brilliant headless browsers) instance automatically everytime NewSession requested.
Development
Download
git clone https://github.com/web-driverify/web-driverify.git
Install
# fibers in wdio requires -std=gnu++0x, thus make sure gcc4.3+ installed.
cd web-driverify && npm install
Run test
# Run all test cases
npm test
# run unit/e2e test cases separately
# attach phantom.js
npm run debug:phantom
# run cases, in another shell
npm run test:unit
npm run test:e2e
Differences with WebDriver Protocol
Web-driverify is implemented in comformance to JSON Wire Protocol, the HTTP APIs exposed by web-driverify are just like Selenium 2, thus compliant with selenium-based test runners like Webdriverio.
Web-driverify cannot launch your browser by itself, you need set your browser's proxy to the Web-driverify server and open a session by visiting the given URL.
Due to limitaions of Javascript, we can't do the same things as selenium.
Implementation Status
APIs are categorized as WebDriver W3C Candidate Recommandation.
Sessions
| Command Name | API Endpoint | wdio API | Status |
| ------------------------------ | ---------------------------------------- | ------------------------- | ----------- |
| Status | GET /status | .status()
| 🕑 |
| New Session | POST /session | .session()
| ✅ |
| Get Active Sessions | GET /sessions | .sessions()
| 🕑 |
| Get Session | GET /session/:sessionId | .session(id)
| 🕑 |
| Delete Session | DELETE /session/:sessionId | .session('delete')
| ✅ |
| Set Timeouts | POST /session/:sessionId/timeouts | .timeouts()
| 🕑 |
| Set Timeout for Async Script | POST /session/:sessionId/timeouts/async_script | .timeoutsAsyncScript()
| ✅ |
| Set Timout for Implicit Wait | POST /session/:sessionId/timeouts/implicit_wait | .timeoutsImplicitWait()
| 🕑 |
Navigation
| Command Name | API Endpoint | wdio API | Status |
| --------------- | ---------------------------------------- | ------------ | ----------- |
| Go | POST /session/:sessionId/url | .url()
| ✅ |
| Get Current URL | GET /session/:sessionId/url | .getUrl()
| ✅ |
| Back | POST /session/:sessionId/back | .back()
| 🕑 |
| Forward | POST /session/:sessionId/forward | .forward()
| ✅ |
| Refresh | POST /session/:sessionId/refresh | .refresh()
| ✅ |
| Get Title | GET /session/:sessionId/title | .title()
| ✅ |
Document Handling
| Command Name | API Endpoint | wdio API | Status |
| --------------------- | ---------------------------------------- | ----------------- | ----------- |
| Getting Page Source | GET /session/:sessionId/source | .source()
| 🕑 |
| Execute Script | POST /session/:sessionId/execute | .execute()
| ✅ |
| Excecute Async Script | POST /session/:sessionId/execute_async | .executeAsync()
| 🕑 |
Screen Capture
| Command Name | API Endpoint | wdio API | Status |
| --------------- | ---------------------------------------- | --------------- | --------- |
| Take Screenshot | GET /session/:sessionId/screenshot | .screenshot()
| ✅ |
Notes:
- Screenshots are taken by html2cavans, which may difference with real web page.
Input Sources
| Command Name | API Endpoint | wdio API | Status |
| ----------------------- | ---------------------------------------- | ------------------------ | -------- |
| Get Available Engines | GET /session/:sessionId/ime/available_engines | .imeAvailableEngines()
| 👎 |
| Get Active Engine | GET /session/:sessionId/ime/active_engine | .imeActiveEngine()
| 👎 |
| Is IME Activated | GET /session/:sessionId/ime/activated | .imeActivated()
| 👎 |
| Deactivate IME | POST /session/:sessionId/ime/deactivate | .imeDeactivate()
| 👎 |
| Activate IME | POST /session/:sessionId/ime/activate | .imeActivate()
| 👎 |
Notes:
Due to Javascript Limitaions, no input sources APIs will support.
Command Contexts
| Command Name | API Endpoint | wdio API | Status |
| ---------------------- | ---------------------------------------- | ------------------------- | -------- |
| Get Window Handle | GET /session/:sessionId/window_handle | .window()
| 👎 |
| Get Window Handles | GET /session/:sessionId/window_handles | .windowHandles()
| 👎 |
| Switch To Frame | POST /session/:sessionId/frame | .frame()
| 👎 |
| Switch To Parent Frame | POST /session/:sessionId/frame/parent | .frameParent()
| 👎 |
| Switch To Window | POST /session/:sessionId/window | .window()
| 👎 |
| Close Window | DELETE /session/:sessionId/window | .close()
| 👎 |
| Set Window Size | POST /session/:sessionId/window/:windowHandle/size | .windowHandleSize()
| 👎 |
| Get Window Size | GET /session/:sessionId/window/:windowHandle/size | .windowHandleSize()
| 👎 |
| Set Window Position | POST /session/:sessionId/window/:windowHandle/position | .windowHandlePosition()
| 👎 |
| Get Window Position | GET /session/:sessionId/window/:windowHandle/position | .windowHandlePosition()
| 👎 |
| Maximize Window | POST /session/:sessionId/window/:windowHandle/maximize | .windowMaximize()
| 👎 |
Notes:
- Due to Javascript Limitaions, no window APIs will support.
Cookies
| Command Name | API Endpoint | wdio API | Status |
| ------------------ | ---------------------------------------- | ----------------- | ----------- |
| Get All Cookies | GET /session/:sessionId/cookie | .cookie()
| 🕑 |
| Add Cookie | POST /session/:sessionId/cookie | .setCookie()
| 🕑 |
| Delete Cookie | DELETE /session/:sessionId/cookie | .deleteCookie()
| 🕑 |
| Delete All Cookies | DELETE /session/:sessionId/cookie/:name | .deleteCookie()
| 🕑 |
Notes:
- Http-only cookies will fetched from http proxy.
Elements
| Command Name | API Endpoint | wdio API | Status |
| ------------------ | ---------------------------------------- | ------------------ | ----------- |
| Get Active Element | POST /session/:sessionId/element/active | .elementActive()
| 🕑 |
| Is Elements Same | GET /session/:sessionId/element/:id/equals/:other | | 🕑 |
Element Retrieval
| Command Name | API Endpoint | wdio API | Status |
| -------------------------- | ---------------------------------------- | ----------------- | --------- |
| Find Element | POST /session/:sessionId/element | .element()
| ✅ |
| Find Elements | POST /session/:sessionId/elements | .elements()
| ✅ |
| Get Element By Id | GET /session/:sessionId/element/:id | | 👎 |
| Find Element From Element | POST /session/:sessionId/element/:id/element | .$(foo).$(bar)
| ✅ |
| Find Elements From Element | POST /session/:sessionId/element/:id/elements | .$(foo).$$(bar)
| ✅ |
Notes:
Get element by id is a reserved api.
Element Interaction
| Command Name | API Endpoint | wdio API | Status |
| ----------------- | ---------------------------------------- | ------------------- | --------- |
| Element Click | POST /session/:sessionId/element/:id/click | .elementIdClick()
| ✅ |
| Element Clear | POST /session/:sessionId/element/:id/clear | .elementIdClear()
| ✅ |
| Element Send Keys | POST /session/:sessionId/element/:id/value | .elementIdValue()
| ✅ |
| Element Submit | POST /session/:sessionId/element/:id/submit | .submit()
| ✅ |
Element State
| Command Name | API Endpoint | wdio API | Status |
| ------------------------------ | ---------------------------------------- | ---------------------------- | ----------- |
| Is Element Selected | GET /session/:sessionId/element/:id/selected | .elementIdSelected()
| 🕑 |
| Get Element Attribute | GET /session/:sessionId/element/:id/attribute/:name | .elementIdAttribute()
| ✅ |
| Get Element CSS Value | GET /session/:sessionId/element/:id/css/:propertyName | .elementIdCssProperty()
| ✅ |
| Get Element Text | GET /session/:sessionId/element/:id/text | .elementIdText()
| ✅ |
| Get Element Tag Name | GET /session/:sessionId/element/:id/name | .elementIdName()
| 🕑 |
| Get Element Size | GET /session/:sessionId/element/:id/size | .elementIdSize()
| ✅ |
| Is Element Enabled | GET /session/:sessionId/element/:id/enabled | .elementIdEnabled()
| 🕑 |
| Is Element Displayed | GET /session/:sessionId/element/:id/displayed | .elementIdDisplayed()
| ✅ |
| Get Element Location | GET /session/:sessionId/element/:id/location | .elementIdLocation()
| ✅ |
| Get Element Rect | GET /session/:sessionId/element/:id/rect | .elementIdRect()
| ✅ |
| Get Element Location In View | GET /session/:sessionId/element/:id/location_in_view | .elementIdLocationInView()
| 🕑 |
User Prompts
| Command Name | API Endpoint | wdio API | Status |
| --------------- | ---------------------------------------- | ------------------ | ----------- |
| Dismiss Alert | POST /session/:sessionId/dismiss_alert | .alertDismiss()
| 👎 |
| Accept Alert | POST /session/:sessionId/accept_alert | .alertAccept()
| 👎 |
| Get Alert Text | GET /session/:sessionId/alert_text | .alertText()
| 🕑 |
| Send Alert Text | POST /session/:sessionId/alert_text | .alertText(text)
| 👎 |
Low-level Interactions
| Command Name | API Endpoint | wdio API | Status |
| --------------------------------- | ---------------------------------------- | ------------------- | ----------- |
| Get Orientation | GET /session/:sessionId/orientation | .getOrientation()
| 🕑 |
| Set Orientation | POST /session/:sessionId/orientation | .setOrientation()
| 👎 |
| Move the Mouse | POST /session/:sessionId/moveto | .moveTo()
| 🕑 |
| Click the Mouse Button | POST /session/:sessionId/click | .buttonPress()
| 🕑 |
| Click and Hold the Mouse Button | POST /session/:sessionId/buttondown | .buttonDown()
| 🕑 |
| Releases the Mouse Button | POST /session/:sessionId/buttonup | .buttonUp()
| 🕑 |
| Double-click the Mouse Button | POST /session/:sessionId/doubleclick | .doDoubleClick()
| 🕑 |
| Tap the Screen | POST /session/:sessionId/touch/click | .touchClick()
| ✅ |
| Finger Down | POST /session/:sessionId/touch/down | .touchDown()
| 🕑 |
| Finger Up | POST /session/:sessionId/touch/up | .touchUp()
| 🕑 |
| Finger Move | POST session/:sessionId/touch/move | .touchMove()
| 🕑 |
| Finger Scroll | POST session/:sessionId/touch/scroll | .touchScroll()
| 🕑 |
| Double Tap | POST session/:sessionId/touch/doubleclick | | 🕑 |
| Long Tap | POST session/:sessionId/touch/longclick | .touchLongClick()
| 🕑 |
| Flick | POST session/:sessionId/touch/flick | .touchFlick()
| 🕑 |
| Get Geo Location | GET /session/:sessionId/location | .getGeoLocation()
| 🕑 |
| Set Geo Location | POST /session/:sessionId/location | .setGeoLocation()
| 👎 |
Notes:
- Touch and cliks will simulated via Javascript and may not work.
- Set geo locations are not possible when you are using real devices.
Storages
| Command Name | API Endpoint | wdio API | Status |
| ------------------------- | ---------------------------------------- | ----------------------- | ----------- |
| Get Localstorage | GET /session/:sessionId/local_storage | .localStorage()
| 🕑 |
| Set Localstorage | POST /session/:sessionId/local_storage | .localStorage()
| 🕑 |
| Clear Localstorage | DELETE /session/:sessionId/local_storage | .localStorage()
| 🕑 |
| Get Localstorage Item | GET /session/:sessionId/local_storage/key/:key | .localStorage()
| 🕑 |
| Set Localstorage Item | DELETE /session/:sessionId/local_storage/key/:key | .localStorage()
| 🕑 |
| Get Localstorage size | GET /session/:sessionId/local_storage/size | .localStorageSize()
| 🕑 |
| Get Sessionstorage | GET /session/:sessionId/session_storage | .sessionStorage()
| 🕑 |
| Set Sessionstorage | POST /session/:sessionId/session_storage | .sessionStorage()
| 🕑 |
| Clear Sessionstorage | DELETE /session/:sessionId/session_storage | .sessionStorage()
| 🕑 |
| Get Sessionstorage Item | GET /session/:sessionId/session_storage/key/:key | .sessionStorage()
| 🕑 |
| Set Sessionstorage Item | DELETE /session/:sessionId/session_storage/key/:key | .sessionStorage()
| 🕑 |
| Get Sessionstorage Size | GET /session/:sessionId/session_storage/size | .sessionStorageSize()
| 🕑 |
Logs
| Command Name | API Endpoint | wdio API | Status |
| --------------- | ---------------------------------------- | ------------- | ----------- |
| Get Log | POST /session/:sessionId/log | .log()
| 🕑 |
| Get Log Types | GET /session/:sessionId/log/types | .logTypes()
| 🕑 |
Application Cache
| Command Name | API Endpoint | wdio API | Status |
| ------------------------------ | ---------------------------------------- | --------------------------- | ----------- |
| Get Application Cache Status | GET /session/:sessionId/application_cache/status | .applicationCacheStatus()
| 🕑 |