34

Yet another Selenium WebDriver library

Usage no npm install needed!

<script type="module">
  import 4 from 'https://cdn.skypack.dev/34';
</script>

README

34.js

Yet another Selenium WebDriver library for Node...

(Warning: This is a design doc... There's no code, yet! But when it lands, it'll most likely be based on webdriver-http-sync.

Goals:

  • JavaScripty - This should feel like a JavaScript API, not a port from Java
  • For automating web browsers: desktop and mobile
  • Synchronous API - Async makes no sense for shell scripts or user interface test automation.
  • Try to reduce locator strategy proliferation. Use CSS selectors as much as possible.
  • Optimize for interactive exploration at the console.
  • Yeah:
    • Pithy property names FTW
    • Easy discovery of properties via tab completion in the console.
    • e.g. thing.frobulate
  • Boo:
    • e.g. driver.window().getFrobulateStatusOfThing(By.whyAmIStillTyping())

Non-Goals:

  • Automating non-web native apps. (Although I hope this is temporary!)

Install

npm install 34

Example Usage

Driver = require('34').Driver
se = new Driver()

API

// Navigation
// ----------

// Open a URL
se.url = 'http://google.com'
se.open = function(url) { return this.url = url }
se.go = se.open

se.back()
se.forward()
se.refresh()

// Close current window
se.close()

// End current session
se.quit()


// Frame Navigation

// Switch focus to frame
se('#IdOfSomeFrame').focus()

// Switch focus to parent frame
se.parent()


// Window Navigation

// Switch focus to window
se.window('nameOfWindow')



// Interrogation
// -------------

// Driver
se.url
se.title
se.source

// Server status
se.status

// Id of current session
se.session

// List of all sesions
se.sessions

// Handle id of current window
se.window

// List of all window handle ids
se.windows

// Id of active (focused) element
se.activeElement

// Find Element
e = se('#id')
// Find All elements
es = se('*[#id]')

// By name:
se('[name="theName"]')

// By id:
se('#theId')

// By tag name:
// all links
se('a')

// Element
e.attribute('name')
e.css('propname')
e.displayed
e.enabled
e.location
e.locationInView
e.name
e.selected
e.size
e.tag
e.text

// Find child element
e.find('#id')

// Find all child elements
e.find('#id')

// Alerts
se.alert.text


// Manipulation
// ------------

// Driver

// Keyboard
se.keys()
se.keyDown()
se.keyUp()

// Mouse
se.mouse.click()
se.mouse.doubleClick()
se.mouse.down()
se.mouse.moveBy(20,100)
se.mouse.moveTo(0,0
se.mouse.up()

// Slim Jim (https://www.youtube.com/watch?v=KbneMYYI78Q)
se.touch.down()
se.touch.move()
se.touch.tap()
se.touch.up()

// Execute JavaScript
se.execute()
se.executeAsync()

// Take a Screenshot
se.screenshot()

// Element
e.clear()
e.click()
e.keys()
e.submit()

// Alerts
se.alert.accept()
se.alert.dismiss()
se.alert.focus()
se.alert.keys()



// Feng Shui
// ---------

// Get size of current window
se.size

// Set size of current window
se.size = [200, 200]

// Get position of current window
se.position

// Get position of current window
se.position = [200,200]

// Maximize size of current window
se.maximize()

// (For mobile...)
se.orientation
se.orientation = LANDSCAPE
se.orientation = PORTRAIT



// Synchronisation
// ---------------
se.timeouts.implicitWait = 10000
se.timeouts.pageLoad = 10000
se.timeouts.asyncScript = 10000