npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

awb

v0.7.10

Published

simple light weight interface for selenium webdriver (node js)

Downloads

131

Readme

UI automated testing framework powered by Node.js. Uses the Selenium WebDriver API. Uses the ChromeDriver API

Contributing guide here

Base: lazy elements, chrome driver dirrect connection, own standalone server, chrome and gecko driver installer

npm downloads Build Status Install Node.js and install framework

$ npm i --SD awb

Drivers installation

$ awb standalone chrome gecko

Run driver selenium-standalone-server or chrome driver

$ awb start standalone  #for standalone
$ awb start chrome  #for chromedriver
$ awb start gecko  #for geckdriver

or postinstall, will install gecko chrome drivers and selenium standalone server

"postinstall": "awb standalone gecko chrome"

Simple as a library

Use with mocha or other test runner

Take a look awb Api

Base example


const awb = require('awb')

const { client, $ } = awb()

async function findInGoogle_potapovDim() {
  const baseURL = 'https://www.google.com.ua/'
  //selectors
  const submitsearch = '[name="btnK"]'
  const inputsearch = '#lst-ib'
  const resultsearch = '#ires .g'
  //elements
  const submitSearch = $(submitsearch).waitForClickable(1000) //lazy element with  expected condition
  const resultSearch = $(resultsearch).waitForElement(1000) //lazy element with  expected condition
  const inputSearch = $(inputsearch)
  // start driver and start driver
  await client.startDriver()
  await client.goTo(baseURL)
  // page activity
  await inputSearch.sendKeys('git hub potapovDim')
  await submitSearch.click()
  const allTextInSelector = await resultSearch.getText()
  console.log(allTextInSelector.includes('potapovDim')) //output: true
  // kill browser and stop driver
  await client.close()
  await client.stopDriver()
}
findInGoogle_potapovDim()

More examples here -> Element util examples here ->

Api

More about DesiredCapabilities

Client

  /*
   * config example, optional, this example config is default config
   */
  const defautlOpts = {
    remote: false, // if remote true startDriver() will not work, default false
    directConnect: false, // if directConnect true directConnect() will run gecko or chrome driver without selenium standalone server, default false
    host: 'localhost', // host, default 'localhost' or '127.0.0.1' or '0.0.0.0'
    port: 4444, // port on what will be runned client driver
    slowTime: 200, // will delay 200 ms every request
    desiredCapabilities: {
      javascriptEnabled: true,
      acceptSslCerts: true,
      platform: 'ANY',
      clientName: 'chrome'
    },
    timeout: 5000 // time what will wait response from driver
  }

  const awb = require('awb')
  const {client, $, $$} = awb(config)
  /*
   * awb() returns element, elements, client instance
   * if run awb without args, will be used default config from example
   */

goTo

  const awb = require('awb')
  const {client} = awb()
  await client.goTo('https://google.com')
  /*
   * args url
   * type string
   */

goToInNewTab

  const awb = require('awb')
  const {client} = awb()
  await client.goTo('https://google.com')
  await client.goToInNewTab('https://facebook.com')
  // will open facebook in new browser tab
  /*
   * args url
   * type string
   */

wait

  const awb = require('awb')
  const {client, $} = awb()
  await client.goTo('https://google.com')
  await client.wait(5000, async () => $('#test').isDisplayed(), 'Test error message')
  /*
   * will wail 5000 ms until appear element with css selector #test
   */

Keys

  const awb = require('awb')
  const { element, client } = awb()
  const el = element('.test.class')
  await el.sendKeys('test name', client.Keys.ENTER) // for submit

getSize

  const awb = require('awb')
  const { element, client } = awb()
  const size = await client.getSize() //{ height: 983, width: 1200 } for example
  /*
   * any args
   * return current window size {height: number, width: number}
   */

dispatchEvent

    const awb = require('awb')
    const { element, client } = awb()
    const div1 = $('.div___1') // event listener mouseenter
    const div2 = $('.div___2') // event listener mouseover
    const div3 = $('.div___3') // event listener mouseleave

    await client.goTo(pathResolver(file))

    await client.dispatchEvent(div1, client.eventsList.mouseEnter)
    await client.dispatchEvent(div2, client.eventsList.mouseOver)
    await client.dispatchEvent(div3, client.eventsList.mouseLeave)
    // will dispatch event

doubleClick

  const awb = require('awb')
  const { element, client } = awb()
  await client.doubleClick($('button')) // will click button element
  await client.doubleClick({x: 100, y: 200}) // will click by coordinates
  /*
   *  args: ElementAWB or object {x: number, y: number}
   */

alert

  const awb = require('awb')
  const { element, client } = awb()
  const alert = client.alert //getter
  // return client alert api

presskeys

  const awb = require('awb')
  const { client } = awb()
  await client.presskeys(client.Keys.F1, client.Keys.F2, client.Keys.F3)
  // will press F1, F2, F3 keys

   /*
   *  args: Keys
   */

accept

await alert.accept()

sendKeys

  const awb = require('awb')
  const { element, client } = awb()
  const prompt = client.alert //getter
  await prompt.sendKeys('test') //set test to prompt box
  await prompt.accept() // accept prompt box

dismiss

 await alert.dismiss()

getText

const alertText =  await alert.getText()
/*
return text from alert
*/

maximizeWindow

  const awb = require('awb')
  const { element, client } = awb()
  await client.maximizeWindow()
  // will maximize browser window

localStorage

  const awb = require('awb')
  const { element, client } = awb()
  const localStorage = client.localStorage //getter
 // return client localStorage api

get

const token = await localStorage.get('token')
/*
  args key = string
  return value
*/

set

 await localStorage.set('token', 'test-token')
/*
  args: key = string, value = string
*/

clear

 await localStorage.clear()
 /*
  clear all localStorage data
 */

getAll

 const data = await localStorage.getAll()
 /*
 return all localStorage data
 */

sessionStorage

  const awb = require('awb')
  const { element, client } = awb()
  const sessionStorage = client.sessionStorage //getter
  // return client sessionStorage api

pageSource

  const awb = require('awb')
  const { element, client } = awb()
  const source = await client.pageSource()
  // return current window page source

get

const token = await sessionStorage.get('token')
/*
  args key = string
  return value
*/

set

 await sessionStorage.get('token', 'test-token')
/*
  args: key = string, value = string
*/

clear

 await sessionStorage.clear()
 /*
  clear all sessionStorage data
 */

getAll

 const data = await sessionStorage.getAll()
 /*
 return all sessionStorage data
 */

startDriver

  const awb = require('awb')
  const { element, client } = awb()
  await client.startDriver()
  /*
   * it will start selenium process
   * if selenium standalone chromedriver geckdriver was install
   * /

stopDriver

  await client.stopDriver()
  /*
   * it will stop selenium process
   * if it was runned by previous command
   * /

closeCurrentTab

  const awb = require('awb')
  const { element, client } = awb()
  await client.closeCurrentTab()
  /*
   * will close current tab
   * if opened tabs length more than 1
   * /

waitForUrlIncludes

  const awb = require('awb')
  const { element, client } = awb()
  await client.waitForUrlIncludes('test', 1000)
  /*
   * will wait 1000ms for url includes test
   * /

getRect

  const awb = require('awb')
  const { element, client } = awb()
  await client.getRect()
  /*
   * will return object format { height: number, width: number, x: number, y: number }
   * /

waitForTitleInclude

  const awb = require('awb')
  const { element, client } = awb()
  await
  await client.waitForTitleInclude('New title', 1000)
  /*
   * will wait 1000ms for title includes test
   * /

switchToFrame

  const awb = require('awb')
  const { element, client } = awb()
  await client.switchToFrame(element('#myFrame'))
  /*
   * arg element frame
   * /

switchBack

  const awb = require('awb')
  const { element, client } = awb()
  await client.switchToFrame('#myFrame')
  // do some action with elements with frame
  await client.switchBack()
  /*
   * return to initial context
   * /

refresh

  const awb = require('awb')
  const { element, client } = awb()
  await client.refresh()
  /*
   * refresh client current page
   * /

back

  const awb = require('awb')
  const { element, client } = awb()
  await client.back()
  /*
   * client histor go back
   * /

forward

  const awb = require('awb')
  const { element, client } = awb()
  await client.forward()
  /*
   * client histor go forward
   * /

getTitle

  const awb = require('awb')
  const { element, client } = awb()
  const currentTitle = await client.getTitle()
  /*
   * will return tab title
   * /

executeScript

  const awb = require('awb')
  const { element, client } = awb()
  const currentTitle = await client.executeScript(function () {
    const [cssSelector] = arguments
    return document.querySelector(cssSelector).innerHTML
  }, 'body')
  /* first arg is function or string function ,for example 'return arguments[0]'
   * if function return value it will be returned
   * /

executeScriptAsync

  const awb = require('awb')
  const { element, client } = awb()
  const currentTitle = await client.executeScriptAsync(function () {
    const [callback] = arguments
      fetch('http://localhost:8085/bar', {
        node: 'no-cors'
      }).then(resp => resp.json()).then(callback)
  })
  /* first arg is function or string function ,for example 'return arguments[0]'
   * if function return value it will be returned
   * /

switchToTab

  const awb = require('awb')
  const { element, client } = awb()
  await client.switchToTab(1)
  /* for example if was opened link with _blank
   * will switch to opened tab
   * /

close

  const awb = require('awb')
  const { element, client } = awb()
  await client.close()
  /* for example if was focused tab from switchToTab example
   * this will close current tab and focus you to previous
   * /

getCurrentclientTab

  const awb = require('awb')
  const { element, client } = awb()
  const tabId = await client.getCurrentclientTab()
  /* return selenium tab id * /

getclientTabs

  const awb = require('awb')
  const { element, client } = awb()
  const tabIdS = await client.getclientTabs()
  /*
  * return array with selenium tab ids
  */

sleep

  const awb = require('awb')
  const { element, client } = awb()
  await client.sleep(1000)
  /* args number timeout
  * will wait until timeout end
  */

getUrl

  const awb = require('awb')
  const { element, client } = awb()
  const currentUrl = await client.getUrl()
  /* return current tab url*/

takeScreenshot

  const awb = require('awb')
  const { client } = awb()
  const screenshot = await client.takeScreenshot()
  /* return string (base64 encoded image) */

saveScreenshot

  const awb = require('awb')
  const { client } = awb()
  await client.saveScreenshot('someName')
  await client.saveScreenshot('someName', {
    path: '/dev/null',
    format: 'jpeg',
    screenshot: 'encoded string',
    encoding: 'customEncoding',
  })
  /* Saves screenshot in png format into `screenshots` folder.
  Optional parameters are passed as object (second parameter) and might have:
   path where to save screenshots (path of any nesting levels will be created automatically)
   format (jpeg)
   screenshot (by default screenshot will be taken with client.takescreenshot method but it is possible to pass any screenshot as a string)
   encoding*/

Element

ConstructorElement

  const awb = require('awb')
  const { element, client } = awb()
  const elementDiv = element('div')
  /*
  * args css selector for example '#id', '[name="name"]', '.class'
  */

element.css

  const awb = require('awb')
  const { element, client } = awb()
  const elementDiv = element.css('div') //args css selector for example '#id', '[name="name"]', '.class'
  /*
  * args css selector for example '#id', '[name="name"]', '.class'
  */

element.xpath

  const awb = require('awb')
  const { element, client } = awb()
  const elementDiv = element.xpath('/html/body/div')
  /*
  * args xpath
  */

element.id

  const awb = require('awb')
  const { element, client } = awb()
  const elementDiv = element.id('uniq-id')
  /*
  * args element id
  */

sendKeys

  const awb = require('awb')
  const { element, client } = awb()
  const elementInput = element('input')
  await elementInput.sendKeys('test value')
  /*
  * args string or array string
  */

size

  const awb = require('awb')
  const { element, client } = awb()
  const elementInput = element('input')

  const {width, height} = await elementInput.size()
  /*
  * return element`s width and height
  */

getRect

  const awb = require('awb')
  const { element, client } = awb()
  const elementInput = element('input')

  const {width, height, x, y } = await elementInput.getRect()
  /*
  * return element`s width and height, and location x, y
  */

location

  const awb = require('awb')
  const { element, client } = awb()
  const elementInput = element('input')

  const {y, x} = await elementInput.location()
  /*
  * return element`s start, x and y where element begins
  */

locationView

  const awb = require('awb')
  const { element, client } = awb()
  const elementInput = element('input')

  const {x, y} = await elementInput.locationView()
  /*
  * return element`s start, x and y where element begins in view port
  */

clear

  const awb = require('awb')
  const { element, client } = awb()
  const elementInput = element('input')
  await elementInput.clear()
  /*
  * clear value inside input
  */

waitTextContains

  const awb = require('awb')
  const { element, client } = awb()
  const elementInput = element('button').waitTextContains('test', 2500)
  await elementInput.click()
  /*
  * will wait until test does not include 'test'
  */

getElementHTML

  const awb = require('awb')
  const { element, client } = awb()
  const elementInput = element('input')
  const inputHTML = await elementInput.getElementHTML()
  /*
  * return outerHTML of current element , return string
  * <input value="a"/> for example
  */

getText

  const awb = require('awb')
  const { element, client } = awb()
  const elementDiv = element('div')
  const divText = await elementDiv.getText()
  /*
  * return all text inside element , return string
  */

getComputedStyle

  const awb = require('awb')
  const { element, client } = awb()
  const span = element('span')
  const textAnchorValue = await span.getComputedStyle(span.computedStyleList.textAnchor)
  /*
   * will return string with computed style value
   * /

getColor

  const awb = require('awb')
  const { element, client } = awb()
  const elementDiv = element('div')
  const divText = await elementDiv.getColor()
  /*
  * return rgba color
  */

waitForElement

  const awb = require('awb')
  const { element, client } = awb()
  const elementDiv = element('div').waitForElement(1000)

  /*
  * will wait for element mount to DOM node
  */

waitForElementPresent

  const awb = require('awb')
  const { element, client } = awb()
  const elementDiv = element('div').waitForElementPresent(1000)
  /*
  * will wait for element mount to DOM node
  */

wait

const awb = require('awb')
const { element, client } = awb()
const elementDiv = element('div').wait(1000, async (el) => await el.getText() ==='test')
  /*
  * will wait for element mount to DOM node
  */

waitForClickable

  const awb = require('awb')
  const { element, client } = awb()
  const elementDiv = element('div').waitForClickable(1000)
  /*
  * will wait for element mount to DOM node
  */

waitForElementVisible

  const awb = require('awb')
  const { element, client } = awb()
  const elementDiv = element('div').waitForElementVisible(1000)
  /*
  * will wait for element visible in DOM 1000ms
  */

waitUntilDisappear

  const awb = require('awb')
  const { element, client } = awb()
  const elementDiv = element('div').waitForElementVisible(1000)
  await elementDiv.click()
  await elementDiv.waitUntilDisappear(10000)
  // do other
  /*
  * will wait for element unmount from DOM 1000ms
  */

element

  const awb = require('awb')
  const { element, client } = awb()
  const elementSpan = element('div').element('span').element('a')
  /*
  *  return element instanse
  */

elements

  const awb = require('awb')
  const { element, client } = awb()
  const elementsSpan = element('div').elements('span')
  /*
  *  return Elements instance
  */

elements.css

  const awb = require('awb')
  const { element, client } = awb()
  const elementsSpan = element('div').elements('span')
  /*
  *  return Elements instance
  */

getAttribute

  const awb = require('awb')
  const { element, client } = awb()
  const elementSpan = element('div').element('span')
  const style = await elementSpan.getAttribute('style')
  /*
  * args strin , value name , for example 'value', 'href', 'style' etc
  *  return string of attribute value
  */

click

  const awb = require('awb')
  const { element, client } = awb()
  const elementSpan = element('div').element('span')
  await elementSpan.click()
  /*
  * triger click
  */

rightClick

  const awb = require('awb')
  const { element, client } = awb()
  const elementSpan = element('div').element('span')
  await elementSpan.rightClick()
  /*
  * triger click right mouse button
  */

doubleClick

  const awb = require('awb')
  const { element, client } = awb()
  const elementSpan = element('div').element('span')
  await elementSpan.doubleClick()
  /*
  * triger doubleClick
  */

isPresent

  const awb = require('awb')
  const { element, client } = awb()
  const elementSpan = element('div').element('span')
  const present = await elementSpan.isPresent()
  /*
  * return true if element mounted to DOM
  * return false if element didn`t mount to DOM
  */

isDisplayed

  const awb = require('awb')
  const { element, client } = awb()
  const elementSpan = element('div').element('span')
  const display = await elementSpan.isDisplayed()
  /*
  * return true if visible and in view port
  * return false if doesn`t visible, for example display: none
  */

toElement

  const awb = require('awb')
  const { element, client } = awb()
  const elementSpan = element('div').element('span')
  await elementSpan.toElement()
  /*
  * will scroll view port to element
  */

mouseDownAndMove

  const awb = require('awb')
  const { element, client } = awb()
  const elementSpan = element('div').element('span')
  await elementSpan.mouseDownAndMove({x: 100, y: 0})
  /*
  * args object with x and y
  * will mouse down mouse move from x and y from arg
  */

Elements

Constructor elements

  const awb = require('awb')
  const { element, elements, client } = awb()
  // by css selector
  const elementsSpan = elements('span')// work the same as element.css
 /*
  *  return array Element instaces
  */

elements.css

  const awb = require('awb')
  const { element, elements, client } = awb()
  const elementDiv = elements('div')
  // by css selector
  const elementsSpan = elements.css('span') // will find element by css selector
 /*
  *  return array Element instaces
  */

elements.xpath

  const awb = require('awb')
  const { element, elements, client } = awb()
  // by css selector
  const elementsDiv = elements.xpath('/html/body/div') // will find element by xpath
 /*
  *  return array Element instaces
  */

waitForElements

  const awb = require('awb')
  const { element, elements, client } = awb()
  const elementDiv = elements('div').waitForElements(1000)
  /*
  * will wait for first element with selector mount to DOM node
  */

map

  // by css selector
  const awb = require('awb')
  const { element, elements, client } = awb()
  const elementsSpan = elements('span')
  const textArr = await elementsSpan.map(async (element) => {
        return await element.getText()
      })
  /*
  *  args async call back
  *  return array
  */

forEach

  const awb = require('awb')
  const { element, elements, client } = awb()
  //by css selector
  const elementsSpan = elements('span')

  const textArr = await elementsSpan.forEach(async (element) => {
        const html = await element.getElementHTML()
        expect(html).to.includes('dropitem')
        expect(html).to.includes('draggable="true"')
      })
  /*
  * args async call back
  * call async funcs with await
  * does not return
  * /

every

  const awb = require('awb')
  const { element, elements, client } = awb()
  //by css selector
  const elementsSpan = elements('span')

  const textArr = await elementsSpan.every(async (element) => {
        return (await element.getText()).includes('test') // if every element test includes "test" method will return true
      })                                                  // if someone element does not includes "test" method will return false
  /*
  * args async call back
  * call async funcs with await
  * return boolean
  * /

some

  const awb = require('awb')
  const { element, elements, client } = awb()
  //by css selector
  const elementsSpan = elements('span')

  const textArr = await elementsSpan.some(async (element) => {
        return (await element.getText()).includes('test') // if someone element includes "test" method will return false
      })
  /*
  * args async call back
  * call async funcs with await
  * return boolean
  * /

waitUntilDisappear

  const awb = require('awb')
  const { elements, client } = awb()
  const links = element('a')
  await links.waitUntilDisappear(10000) // will assert that every element with css selector disappear from page
  /*
  * will wait for elements unmount from DOM 1000m
  */

count

  const awb = require('awb')
  const { element, elements, client } = awb()
  const elementsCount = await elements('span').count()
  /*
  * return elements quantity, return number
  * /

filter

  const awb = require('awb')
  const { element, elements, client } = awb()
  const elementsSpan = elements('span')
  const textArr = await elementsSpan.filter(async (element) => {
        const html = await element.getElementHTML()
        return html.includes('class="test"')
      })
  /*
  * args async call back
  * call async funcs with await
  * return new elements array
  * /

get

  const awb = require('awb')
  const { element, elements, client } = awb()
  const elementsSpan = elements('span')
  const elementWithText = elementsSpan.get(3)
  await elementWithText.getText()
  /*
  * args index number
  * return Element instance
  * /

Improvement plan

  • [x] Run selenium server from a client instance method
  • [x] Add possibility find element by xpath (done)
  • [ ] Develop error handler system
  • [x] Develop and improve enviroment installer for every OS
  • [ ] Develop full util system support
  • [ ] Fix proxy system for element util