Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

Software Engineer at I am working on ▪ DevTools team ▪ WebdriverIO ▪ Some things Hello ! I AM CHRISTIAN 2

Slide 3

Slide 3 text

1 A NEW VERSION Why do you let me rewrite all my existing tests again??? 3

Slide 4

Slide 4 text

GOALS 4

Slide 5

Slide 5 text

“Working day jobs, maintainers today can struggle to find the time to fix critical bugs, all the while facing incessant demands from users requesting free support on GitHub. Maintainer burnout is a monstrous challenge.” techcrunch.com 5

Slide 6

Slide 6 text

6 Community First!

Slide 7

Slide 7 text

7 Governance

Slide 8

Slide 8 text

Month of active development 12 32 Unique collaborators 800 Commits 8

Slide 9

Slide 9 text

later 7 weeks 68 Unique collaborators 1023 Commits 9

Slide 10

Slide 10 text

10 NEW MODULE SYSTEM Powered by Lerna.io

Slide 11

Slide 11 text

11

Slide 12

Slide 12 text

Package Names Changed 12 Internal Maintained Packages: wdio-dot-reporter → @wdio/dot-reporter wdio-mocha-framework → @wdio/mocha-framework wdio-sauce-service → @wdio/sauce-service ▪ Packages starting with @wdio are “official” maintained packages ▪ Community packages stay as is (e.g. wdio-*-service) ▪ @wdio packages are being preferred before wdio-* packages

Slide 13

Slide 13 text

webdriverio Consumes the webdriver package and adds syntactic sugar on top of it (e.g. stale element retries) SEPARATION OF CONCERNS webdriver Is responsible to provide a simple non-opinionated interface to make HTTP requests to a driver. @wdio/cli A testrunner that provides everything needed to build a test suite on a large scale. 13

Slide 14

Slide 14 text

SEPARATION OF CONCERNS import WebDriver from 'webdriver' ;(async () => { const client = await WebDriver.newSession({ path: '/', capabilities: { browserName: 'firefox' } }) await client.navigateTo('https://www.google.com/ncr') const searchInput = await client.findElement('css selector', '#lst-ib') await client.elementSendKeys(searchInput['element-6066-11e4-a52e-4f735466cecf'], 'WebDriver') const searchBtn = await client.findElement('css selector', 'input[value="Google Search"]') await client.elementClick(searchBtn['element-6066-11e4-a52e-4f735466cecf']) console.log(await client.getTitle()) // outputs "WebDriver - Google Search" await client.deleteSession() })() 14 webdriver

Slide 15

Slide 15 text

Webdriver package $ npm install webdriver ▪ The true protocol binding ▪ Defines commands for WebDriver, JSONWire Protocol, Appium, Mobile JSONWire Protocol, Chromium and SauceLabs ▪ Easy to maintain: all commands are defined as a JSON ▪ Client only gets commands assigned based on its capabilities from the session response ▪ !!! Required us to rename a bunch of commands !!! (see CHANGELOG.md for details) 15

Slide 16

Slide 16 text

Webdriver package 16 "/session/:sessionId/url": { "GET": { "command": "getUrl", "description": "The Get Current URL command returns the URL of the current top-level browsing context.", "ref": "https://w3c.github.io/webdriver/#dfn-get-current-url", "parameters": [] }, "POST": { "command": "navigateTo", "description": "The navigateTo (go) command is used to cause the user agent to navigate the current ...", "ref": "https://w3c.github.io/webdriver/#dfn-navigate-to", "parameters": [{ "name": "url", "type": "string", "description": "string representing an absolute URL (beginning with http(s)), possibly including ...", "required": true }], "returns": { "type": "String", "name": "url", "description": "current document URL of the top-level browsing context." } } },

Slide 17

Slide 17 text

▪ Browser vs. Element scope ▪ No command chaining anymore SEPARATION OF CONCERNS browser.url('http://v4.webdriver.io/api.html'); $('.searchbar input').setValue('getT'); var results = $$('.commands.property a').filter(function (link) { return link.isVisible(); }); expect(results.length).to.be.equal(3); // check out second result results[1].click(); expect($('.doc h1').getText()).to.be.equal('GETTEXT'); 17 webdriverio

Slide 18

Slide 18 text

SEPARATION OF CONCERNS // wdio.conf.js const path = require('path') exports.config = { /** * server configurations */ hostname: 'ondemand.saucelabs.com', port: 443, region: 'eu', /** * specify test files */ specs: [path.resolve(__dirname, 'mocha.test.js')], // ... } 18 @wdio/cli $ ./node_modules/.bin/wdio wdio.conf.js

Slide 19

Slide 19 text

NEW FEATURES e.g. DevTools service with performance capabilities 19

Slide 20

Slide 20 text

20 DEVTOOLS SERVICE Chromedriver HTTP browser.url("https://webdriver.io") browser.startTracing() WebSockets WebSockets

Slide 21

Slide 21 text

NEW FEATURES e.g. Applitools service 21

Slide 22

Slide 22 text

NEW FEATURES e.g. Watch Functionality 22

Slide 23

Slide 23 text

NEW FEATURES e.g. Debugging 23

Slide 24

Slide 24 text

NEW DOCS ...with blog, videos and much more 24

Slide 25

Slide 25 text

25 How To Update? https://www.youtube.com/watch?v=vC3X4ZdysYI

Slide 26

Slide 26 text

26 Roadmap

Slide 27

Slide 27 text

27 one last note

Slide 28

Slide 28 text

Thanks! ANY QUESTIONS? You can find me 24/7 on the Gitter.im support channel or @bromann on Twitter or @christian-bromann on GitHub 28

Slide 29

Slide 29 text

SlidesCarnival icons are editable shapes. This means that you can: ● Resize them without losing quality. ● Change fill color and opacity. Isn’t that nice? :) Examples: 29

Slide 30

Slide 30 text

Now you can use any emoji as an icon! And of course it resizes without losing quality and you can change the color. How? Follow Google instructions https://twitter.com/googledocs/status/730087240156643328 ✋❤ and many more... 30