0.0.1 • Published 6 years ago
wdb v0.0.1
UI automated testing framework powered by Node.js. Uses the Selenium WebDriver API. Uses the ChromeDriver API
Base: lazy elements, chrome driver dirrect connection, own standalone server and chrome driver installer
Install Node.js and install framework
Improvement plan
- Run selenium server from a client instance method
- Add possibility find element by xpath (done)
- Develop error handler system
- Develop and improve enviroment installer for every OS
$ npm i --SD wd-interface
Drivers installation
$ wd-interface standalone chrome gecko
Run driver selenium-standalone-server or chrome driver
$ wd-interface start standalone #for standalone
$ wd-interface start chrome #for chromedriver
$ wd-interface start gecko #for geckdriver
Simple as a library
Use with mocha or other test runner
Base example Api
const { expect } = require('chai')
const { client, element } = require('wd-interface')
describe('Google base example', () => {
let browser = null
const baseURL = 'https://www.google.com.ua/'
//selectors
const submitsearch = '[name="btnK"]'
const inputsearch = '#lst-ib'
const resultsearch = '#ires .g'
//elements
const submitSearch = element(submitsearch)
const inputSearch = element(inputsearch)
const resultSearch = element(resultsearch)
before(async () => {
browser = client().chrome() // for dirrect connection to chromedriver client().chrome(true)
await browser.startSelenium()
await browser.goTo(baseURL)
})
after(async () => {
await browser.closeBrowser()
await browser.stopSelenium()
})
it('search git hub potapovDim', async () => {
await inputSearch.sendKeys('git hub potapovDim')
await submitSearch.click()
await browser.sleep(1000)
await resultSearch.waitForElement(1000)
const allTextInSelector = await resultSearch.getText()
expect(allTextInSelector).to.includes('potapovDim')
})
})
Api
Browser
const {client} = require('wd-interface')
const browserChrome = client().chrome() // for chrome browser
const browserFirefox = client().firefox() //for firefox browser
/* return browser api instance
* args directConnect bool true to chrome or gecko driver , false for connect to standalone server
* timeouts = {
* 'script': 5000, // Sets the amount of time to wait for an asynchronous script to finish execution before throwing an error.
* 'implicit': 5000, // Specifies the amount of time the driver should wait when searching for an element if it is not immediately present.
* 'page load': 5000, // Sets the amount of time to wait for a page load to complete before throwing an error.
* 'request': 1000 // Sets the amount of time to wait for a response from driver.
* }
*
* any, false , undefined - conncect to standalone server port 4444
*
*/
chrome
const chromeWithDirrectConnectToChromeDriverAndScriptWaitTenSeconds = client().chrome(true, { 'script': 10000 })
const defaultChrome = client().chrome()
firefox
const fireFoxWithPageLoadNineSecondsAndConnectToStandalone = client().firefox(false, { 'page load': 9000 })
const defaultFireFox = client().firefox()
goTo
const browser = client.chrome()
await browser.goTo('https://google.com')
/* args url
* type string
* /
Keys
const browser = client.chrome()
const el = element('.test.class')
await el.sendKeys('test name', browser.Keys.ENTER) // for submit
startSelenium
const browser = client.chrome()
await browser.startSelenium()
/*
* it will start selenium process
* if selenium standalone chromedriver geckdriver was install
* /
stopSelenium
const browser = client.chrome()
await browser.stopSelenium()
/*
* it will stop selenium process
* if it was runned by previous command
* /
closeCurrentTab
const browser = client.chrome()
await browser.closeCurrentTab()
/*
* will close current tab
* if opened tabs length more than 1
* /
waitForUrlIncludes
const browser = client.chrome()
await browser.waitForUrlIncludes('test', 1000)
/*
* will wait 1000ms for url includes test
* /
switchToFrame
const browser = client.chrome()
await browser.switchToFrame('#myFrame')
/*
* arg css selector (id , class or some atribute)
* /
refresh
const browser = client.chrome()
await browser.refresh()
/*
* refresh browser current page
* /
back
const browser = client.chrome()
await browser.back()
/*
* browser histor go back
* /
forward
const browser = client.chrome()
await browser.forward()
/*
* browser histor go forward
* /
getTitle
const browser = client.chrome()
const currentTitle = await browser.getTitle()
/*
* will return tab title
* /
executeScript
const browser = client.chrome()
const currentTitle = await browser.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 browser = client.chrome()
const currentTitle = await browser.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 browser = client.chrome()
await browser.switchToTab(1)
/* for example if was opened link with _blank
* will switch to opened tab
* /
closeBrowser
const browser = client.chrome()
await browser.closeBrowser()
/* for example if was focused tab from switchToTab example
* this will close current tab and focus you to previous
* /
getCurrentBrowserTab
const browser = client.chrome()
const tabId = await browser.getCurrentBrowserTab()
/* return selenium tab id * /
getBrowserTabs
const browser = client.chrome()
const tabIdS = await browser.getBrowserTabs()
/*
* return array with selenium tab ids
*/
sleep
const browser = client.chrome()
await browser.sleep(1000)
/* args number timeout
* will wait until timeout end
*/
getUrl
const browser = client.chrome()
const currentUrl = await browser.getUrl()
/* return current tab url*/
Element
ConstructorElement
const elementDiv = element('div')
/*
* args css selector for example '#id', '[name="name"]', '.class'
*/
sendKeys
const elementInput = element('input')
await elementInput.sendKeys('test value')
/*
* args string or array string
*/
clear
const elementInput = element('input')
await elementInput.clear()
/*
* clear value inside input
*/
getElementHTML
const elementInput = element('input')
const inputHTML = await elementInput.getElementHTML()
/*
* return outerHTML of current element , return string
* <input value="a"/> for example
*/
getText
const elementDiv = element('div')
const divText = await elementDiv.getText()
/*
* return all text inside element , return string
*/
waitForElement
const elementDiv = element('div')
await elementDiv.waitForElement(1000)
/*
* will wait for element mount to DOM node
*/
waitForElementPresent
const elementDiv = element('div')
await elementDiv.waitForElementPresent(1000)
/*
* will wait for element mount to DOM node
*/
waitForElementVisible
const elementDiv = element('div')
await elementDiv.waitForElementVisible(1000)
/*
* will wait for element visible in DOM node
*/
getElement
const elementSpan = element('div').getElement('span').getElement('a')
/*
* return element instanse
*/
getElements
const elementsSpan = element('div').getElements('span')
/*
* return Elements instance
*/
getAttribute
const elementSpan = element('div').getElement('span')
const style = await elementSpan.getAttribute('style')
/*
* args strin , value name , for example 'value', 'href', 'style' etc
* return string of attribute value
*/
click
const elementSpan = element('div').getElement('span')
await elementSpan.click()
/*
* triger click
*/
isPresent
const elementSpan = element('div').getElement('span')
const present = await elementSpan.isPresent()
/*
* return true if element mounted to DOM
* return false if element didn`t mount to DOM
*/
isDisplayed
const elementSpan = element('div').getElement('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 elementSpan = element('div').getElement('span')
await elementSpan.toElement()
/*
* will scroll view port to element
*/
mouseDownAndMove
const elementSpan = element('div').getElement('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 elementDiv = elements('div')
const {elements} = require('wd-interface')
// by css selector
const elementsSpan = elements('span')
// by xpath
const elementsDiv = elements('xpath: /html/body/div[1]/div/div/div/div[1]/div[2]/div[2]/div/div')
/*
* args css selector for example '#id', '[name="name"]', '.class' or xpath format xpath: /html/body/div (for example)
* return array Element instaces
*/
waitForElement
const elementDiv = elements('div')
await elementDiv.waitForElements(1000)
/*
* will wait for first element with selector mount to DOM node
*/
map
// by css selector
const elementsSpan = elements('span')
const textArr = await elementsSpan.map(async (element) => {
return await element.getText()
})
/*
* args async call back
* return array
*/
forEach
//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
* /
filter
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 elementsSpan = elements('span')
const textArr = await elementsSpan.get(0)
/*
* args index number
* return Element instance
* /
0.0.1
6 years ago