WebdriverIO v5.0.0 Release Notes
Release Date: 2018-12-20 // over 5 years ago-
This version comes with a variety of technical changes that might affect the functionality of 3rd party WebdriverIO packages from the community. If such a package causes problems after the update, please raise an issue in the repository of that package and not in this repository. You can find a list of officially maintained packages here.
:boom: Breaking Change
- ๐ฆ moved
wdio
cli command fromwebdriverio
package to@wdio/cli
- ๐ป commands are scoped to
browser
andelement
- no selector property on commands anymorejs // v4 browser.click('#myElem')
js // v5 and upwards const elem = $('#myElem') elem.click()
- no command chaining anymore (in standalone and wdio mode)
js // v4 (standalone/async mode) browser .url('https://duckduckgo.com/') .setValue('#search_form_input_homepage', 'WebdriverIO') // ...
js // v5 (standalone/async mode) await browser.url('https://duckduckgo.com/') const elem = await browser.$('#search_form_input_homepage') await elem.click() await elem.setValue('WebdriverIO')
- every protocol command returns a
value
property instead of raw driver responsejs // v4 const result = browser.execute(() => 1 + 1) console.log(result) // outputs: // { sessionId: '02aee149a1a421b81598ff2a3b90e33d', // value: 2, // _status: 0 }
js // v5 const result = browser.execute(() => 1 + 1) console.log(result) // outputs: 2
- the
remote
andmultiremote
methods to initiate a driver instance now also start the driver session and therefore return a promise (noinit
command anymore)js // v4 import { remote } from 'webdriverio' const driver = remote({ ... }) driver.init().url('https://webdriver.io').end()
js // v5 import { remote } from 'webdriverio' const driver = await remote({ ... }) await driver.url('https://webdriver.io') await driver.deleteSession()
- command changes: over the years WebdriverIO added more and more commands for different automation protocols without applying a pattern to it which resulted in having a bunch of duplication and inconsistent naming, even though the list looks exhausting, most of the commands that have changed were used internally
- renamed commands:
isVisible
โisDisplayed
isVisibleWithinViewport
โisDisplayedInViewport
waitForVisible
โwaitForDisplayed
clearElement
โclearValue
moveToObject
โmoveTo
(element scope only)setCookie
,getCookie
,deleteCookie
โsetCookies
,getCookies
,deleteCookies
getElementSize
โgetSize
source
,getSource
โgetPageSource
title
โgetTitle
actions
โperformActions
(WebDriver protocol only)alertAccept
โacceptAlert
alertDismiss
โdismissAlert
alertText
โgetAlertText
,sendAlertText
applicationCacheStatus
โgetApplicationCacheStatus
(JsonWireProtocol only)cookie
โgetAllCookies
,addCookie
,deleteCookie
getCssProperty
โgetCSSProperty
element
โfindElement
elements
โfindElements
elementActive
โgetActiveElement
elementIdAttribute
โgetElementAttribute
elementIdClear
โelementClear
elementIdClick
โelementClick
elementIdCssProperty
โgetElementCSSValue
elementIdDisplayed
โisElementDisplayed
elementIdElement
โfindElementFromElement
elementIdElements
โfindElementsFromElement
elementIdEnabled
โisElementEnabled
elementIdLocation
โgetElementLocation
elementIdLocationInView
โgetElementLocationInView
(JsonWireProtocol only)elementIdName
โgetElementTagName
elementIdProperty
โgetElementProperty
elementIdRect
โgetElementRect
elementIdScreenshot
โtakeElementScreenshot
elementIdSelected
โisElementSelected
elementIdSize
โgetElementSize
(JsonWireProtocol only)elementIdText
โgetElementText
elementIdValue
โelementSendKeys
frame
โswitchToFrame
frameParent
โswitchToParentFrame
timeoutsAsyncScript
,timeoutsImplicitWait
โsetAsyncTimeout
,setImplicitTimeout
(JsonWireProtocol only)getLocationInView
โgetElementLocationInView
(JsonWireProtocol only)imeActivate
โactivateIME
(JsonWireProtocol only)imeActivated
โisIMEActivated
(JsonWireProtocol only)imeActiveEngine
โgetActiveEngine
(JsonWireProtocol only)imeAvailableEngines
โgetAvailableEngines
(JsonWireProtocol only)imeDeactivated
โdeactivateIME
(JsonWireProtocol only)localStorage
โgetLocalStorage
,setLocalStorage
,clearLocalStorage
,getLocalStorageItem
,deleteLocalStorageItem
(JsonWireProtocol only)localStorageSize
โgetLocalStorageSize
(JsonWireProtocol only)sessionStorage
โgetSessionStorage
,setSessionStorage
,clearSessionStorage
,getSessionStorageItem
,deleteSessionStorageItem
(JsonWireProtocol only)sessionStorageSize
โgetSessionStorageSize
(JsonWireProtocol only)location
โgetElementLocation
log
โgetLogs
(JsonWireProtocol only)logTypes
โgetLogTypes
(JsonWireProtocol only)screenshot
โtakeScreenshot
session
โgetSession
,deleteSession
(JsonWireProtocol only)sessions
โgetSessions
submit
โelementSubmit
timeouts
โgetTimeouts
,setTimeouts
window
,switchToWindow
โswitchWindow
windowHandle
โcloseWindow
,getWindowHandle
windowHandles
โgetWindowHandles
windowHandleFullscreen
โfullscreenWindow
windowHandleMaximize
โmaximizeWindow
windowHandlePosition
โsetWindowPosition
,getWindowPosition
(JsonWireProtocol only),setWindowRect
,getWindowRect
(WebDriver protocol only)windowHandleSize
โsetWindowSize
,getWindowSize
(JsonWireProtocol only),setWindowRect
,getWindowRect
(WebDriver protocol only)hasFocus
โisFocused
end
โdeleteSession
reload
โreloadSession
scroll
โscrollIntoView
context
โgetContext
,switchContext
contexts
โgetContexts
currentActivity
โgetCurrentActivity
deviceKeyEvent
โsendKeyEvent
getAppStrings
โgetStrings
hideDeviceKeyboard
โhideKeyboard
hold
โlongPressKeyCode
launch
โlaunchApp
performMultiAction
โmultiTouchPerform
pressKeycode
โpressKeyCode
rotate
โrotateDevice
setImmediateValue
โsetValueImmediate
settings
โgetSettings
,updateSettings
strings
โgetStrings
toggleTouchIdEnrollment
โtoggleEnrollTouchId
- removed commands (Note: there are chances that removed commands will come back if their use case scenario seem to be reasonable.):
doDoubleClick
,doubleClick
- replace with doubleclick
command orperformActions
commanddragAndDrop
- replace withperformActions
commandleftClick
,middleClick
,rightClick
- replace withperformActions
commandselectByValue
- replace withselectByAttribute('value')
selectorExecute
,selectorExecuteAsync
- replace withexecute(elem)
submit
- replace by clicking on submit buttongetCurrentDeviceActivity
- replace bygetCurrentActivity
release
- replace bytouchAction
commandswipe
,swipeDown
,swipeLeft
,swipeRight
,swipeUp
- replace bytouchAction
commandperformTouchAction
- replace bytouchPerform
- with no replacements:
init
,buttonPress
,file
,chooseFile
,uploadFile
,endAll
,getCommandHistory
,waitForSelected
,waitForText
,waitForValue
,getGridNodeDetails
,gridProxyDetails
,gridTestSession
,hold
- new commands:
- WebDriver / JsonWireProtocol:
minimizeWindow
- Appium:
startRecordingScreen
,stopRecordingScreen
,isKeyboardShown
,getSystemBars
,getDisplayDensity
,endCoverage
,replaceValue
,receiveAsyncResponse
,gsmCall
,gsmSignal
,gsmVoice
,sendSms
,fingerPrint
- WebDriver / JsonWireProtocol:
- renamed commands:
โ adding custom commands are scoped to the prototype they are being added to
// v4 browser.addCommand('myCommand', () => { ... }) const elem = $('myElem') console.log(typeof browser.myCommand) // outputs "function" console.log(typeof elem.myCommand) // outputs "function"
// v5 browser.addCommand('myCommand', () => { ... }) const elem = $('myElem') console.log(typeof browser.myCommand) // outputs "function" console.log(typeof elem.myCommand) // outputs "undefined" elem.addCommand('myElemCommand', () => { ... }) console.log(typeof elem.myElemCommand) // outputs "function" const elem2 = $('myOtherElem') console.log(typeof elem2.myElemCommand) // outputs "undefined"
spec and suite cli arguments are now passed as an array, e.g.
// v4 ./node_modules/.bin/wdio wdio.conf.js --spec ./tests/foobar.js,./tests/baz.js
./node_modules/.bin/wdio wdio.conf.js --suite FooBar,BarBaz
./node_modules/.bin/wdio wdio.conf.js --suite FooBar
```js // v5 ./node_modules/.bin/wdio wdio.conf.js --spec ./tests/foobar.js ./tests/baz.js ./node_modules/.bin/wdio wdio.conf.js --suite FooBar BarBaz ./node_modules/.bin/wdio wdio.conf.js --suite FooBar
- ๐ง custom configuration for services or reporters are now directly applied to the config list, e.g.
js // ... reporters: [ 'spec', [ 'junit', { outputDir: __dirname + '/junit_logs' } ] ], // ...
:eyeglasses: Spec Compliancy
- implemented parameter assertions for protocol commands
- full W3C WebDriver compliancy
- full Appium and Mobile JSONWire Protocol compliancy
- ๐ง simplified protocol command maintenance by defining commands, their parameters and response values within simple json constructs
- ๐ instead of switching protocol within a running session, WebdriverIO now determines the supported protocol by the driver based on the create session response
:rocket: New Feature
- ๐ new package
@wdio/applitools-service
for simple visual regression testing with Applitools - ๐ new package
eslint-plugin-wdio
for WebdriverIO specific linting rules for ESLint - ๐
@wdio/devtools-service
now with frontend performance testing capabilities (see example) - ๐ new
region
option to simply run tests on SauceLabs in different datacenters - ๐ป
debug
command now allows to connect the runner with the Chrome DevTools application for more indepth debugging - ๐ฆ decoupling of
@wdio/sync
package from framework adapters so that there is no need to installfibers
when you want to run your commands with async/await - ๐ฒ autofetching of all provides log types
- auto retry mechansim for all command requests
- auto refetch mechanism for stale elements
- simplified reattachment to existing sessions with
attach
functionality - โ integrated and auto maintained TypeScript definitions
- โ wdio testrunner fails if no spec files were found
:bug: Bug Fix
- ๐ fixed loss of scope when chaining elements (e.g.
$$('div')[2].$('span').getHTML()
) - โก๏ธ browser scope with now updated capabilities (
browser.capabilities
) - ๐ improved watch functionality allows to rerun tests without starting a new session all over again
- ๐ fixed problems with
addCommand
in multiremote
๐ :memo: Documentation
- ๐ brand new documentation page based on the Docusaurus framework
- written in a modern web framework called React
- completely responsive with full support for mobile viewports
- included blog for WebdriverIO related news and article
- ๐ fixed links to edit certain documentation pages
- ๐ documentation page served via HTTPS per default
:house: Internal
- complete rearchitecturing of the whole project into a monorepo
- new v5 codebase with all "offical" supported packages are at
webdriverio/webdriverio
- all depcrecated v4 packages can still be found at github.com/webdriverio-boneyard
- new v5 codebase with all "offical" supported packages are at
- ๐ฆ moved all protocol commands into a
webdriver
base package - ๐ project sub packages are now released within the
@wdio
NPM organization - ๐ฆ renamed services, reporters and other internal packages (e.g.
wdio-sauce-service
โ@wdio/sauce-service
) - โ removed all e2e tests from project to run as unit tests using Jest with a coverage of ~96%
- โก๏ธ update to Babel v7 (latest) as well as various of other dependency updates with security fixes
- CPU and Memory improvements by reducing amount of IPC calls
๐ :nail_care: Polish
- ๐ laid out better governance model for project
- ๐ฆ moved