Nodejs webdriver.io

webdriver.io 官网
官方文档

下文内容翻译自官方文档,水平有限,有能力还是看官方文档

Get Started

安装

1
2
3
4
$ npm install webdriverio --save-dev
#校验是否安装成功
$ ./node_modules/.bin/wdio --help

也可以全局安装wdio,建议安装在项目目录下。

1
2
3
4
$ npm install -g webdriverio --save-dev
#校验是否安装成功
$ wdio --help

设置selenium环境

设置selenium环境的两种方法:

  1. 分别安装selenium serverbrowser driver,获取最新的selenium standalone server
    chrome driver

    1
    2
    3
    4
    安装selenium server
    java -jar /your/download/directory/selenium-server-standalone-3.5.3.jar
    #
  2. 最简单的方法是安装NPM selenium standalone package

1
2
3
4
5
6
#全局安装
npm install selenium-standalone -g
#安装selenium server
selenium-standalone install
#启动firefox, chrome, internet explorer or phantomjs
selenium-standalone start

配置webdriverio实例

如果创建一个WebdriverIO instance,需要定义options设置适当的功能和设置。例如,当调用remote方法时:

1
2
3
4
5
6
7
8
9
10
11
12
13
var webdriverio = require('webdriverio');
var options = {
desiredCapabilities: {
platformName: 'android', // operating system
platformVersion:'4.3', // OS version
browserName: 'chrome', // browser
udid: 'asdfasdfasdf', // udid of the android device
deviceName: 'devicexy', // device name
},
host: 'localhost', // localhost
port: 4723 // port for appium
};
var client = webdriverio.remote(options);

通过一个options对象定义WebdriverIO instance

注意这只在你使用standalone package运行WebdriverIO时时必要的。
如果使用wdio test runner时,options配置在wdio.conf.js配置文件中。

options

desiredCapabilities

定义你所运行的Selenium会话的功能。

具体文档参考Selenium documentation

类型:Object
默认值:{ browserName: 'firefox' }

Example:

1
2
3
4
5
6
browserName: 'chrome', // options: `firefox`, `chrome`, `opera`, `safari`
version: '27.0', // browser version
platform: 'XP', // OS platform
tags: ['tag1','tag2'], // specify some tags (e.g. if you use Sauce Labs)
name: 'my test' // set name for test (e.g. if you use Sauce Labs)
pageLoadStrategy: 'eager' // strategy for page load

pageLoadStrategyselenium 2.46.0实现,

只支持Firefox。有效的值:
normal - 等待document.readyState的值变为complete。默认值。
eager - 当document.readyState的值为interactive时将会放弃等待,而不是等待document.readyState的值变为complete
none - 将立即中止等待,而不必等待任何页面的加载。

logLevel

日志级别。

类型:String
默认值:silent
选项:verbose | silent | command | data | result

verbose: 记录所有日志。
silent: 不记录任何日志。
command: 记录Selenium server 的url访问日志。 (e.g. [15:28:00] COMMAND GET “/wd/hub/session/dddef9eb-82a9-4f6c-ab5e-e5934aecc32a/title”)
data: 请求负载数据的日志 (e.g. [15:28:00] DATA {})
result: Selenium server返回结果日志。 (e.g. [15:28:00] RESULT “Google”)

logOutput

WebdriverIO日志输出到文件。可以定义日志文件的路径,WebdriverIO会生成日志文件,者你可以传递一个可写流,日志会重定向到可写流。

可写流wdio runner 还不支持。

类型:String | writeable stream
默认值:null。

protocol

Selenium standalone server或者(driver)通信时使用的协议。

类型:String
默认值:http

host

WebDriver serverhost

类型:String
默认值:127.0.0.1

port

WebDriver serverport

类型:Number
默认值:4444

path

WebDriver server的路径。

类型:String
默认值:/wd/hub

baseUrl

设置一个base url

类型:String
默认值:null。

connectionRetryTimeout

设置请求Selenium server超时重试时间。

类型:Number
默认值:90000。

connectionRetryCount

设置请求Selenium server超时重试次数。

类型:Number
默认值:3。

coloredLogs

开启日志输出的颜色。

类型:Boolean
默认值:true

deprecationWarnings

警告当使用已弃用的命令时。

类型:Boolean
默认值:true

bail

指定一个数量,运行测试时当没有通过的测试达到该数量时停止执行。注意,当使用一个第三方测试框架如mocha,可能需要额外的配置。

类型:Number
默认值:0。(运行所有tests,不停止执行)

screenshotPath

设置截图路径,用来保存Selenium driver崩溃的截图。

类型:String | null
默认值:null。

screenshotOnReject

如果Selenium driver崩溃,添加当前页面的截图附件到error,可以指定为object设置重试尝试截图超时时间和次数。

类型:String | Object
默认值:false

添加当前页面的截图附件到error使用额外的时间去截图和额外的内存来存储它。所以为了性能它在默认情况下是禁用的。

Example:

1
2
3
4
5
6
7
8
// take screenshot on reject
screenshotOnReject: true
// take screenshot on reject and set some options
screenshotOnReject: {
connectionRetryTimeout: 30000,
connectionRetryCount: 0
}
waitforTimeout

所有waitForXXX命令的默认超时时间。

类型:Number
默认值:1000。

waitforInterval

所有waitForXXX命令的默认循环时间间隔。

类型:Number
默认值:500。

queryParams

用来存储query parameters的键值对,将会被添加到每个selenium请求。

类型:Object
默认值:None。

Example:

1
2
3
4
5
6
7
queryParams: {
specialKey: 'd2ViZHJpdmVyaW8='
}
// Selenium request would look like:
// http://127.0.0.1:4444/v1/session/a4ef025c69524902b77af5339017fd44/window/current/size?specialKey=d2ViZHJpdmVyaW8%3D
}

headers

用来存储headers的键值对,将会被添加到每个selenium请求。值必须是字符串。

类型:Object
默认值:None。

Example:

1
2
3
4
5
headers: {
Authorization: 'Basic dGVzdEtleTp0ZXN0VmFsdWU='
}
// This adds headers based on the key
// This would result in a header named 'Authorization' with a value of 'Basic dGVzdEtleTp0ZXN0VmFsdWU='

debug

开始node调试。

类型:Boolean
默认值:false

execArgv

指定node的参数当启动child processes时。

类型:Array of String
默认值:null

配置Babel

适用于babel 6
安装babel依赖

1
npm install --save-dev babel-register babel-preset-es2015

mocha test
使用mocha内部的编译器注册babel

1
2
3
4
5
mochaOpts: {
ui: 'bdd',
compilers: ['js:babel-register'],
require: ['./test/helpers/common.js']
},

配置.babelrc
使用webdriverio时不建议使用babel-polyfill,使用babel-runtime代替。

1
npm install --save-dev babel-plugin-transform-runtime babel-runtime

.babelrc文件

1
2
3
4
5
6
7
8
{
"presets": ["es2015"],
"plugins": [
["transform-runtime", {
"polyfill": false
}]
]
}

可以使用babel-preset-es2015-nodeX代替babel-preset-es2015,其中X是Node的版本,为了避免不必要的polyfillsgenerators:

1
npm install --save-dev babel-preset-es2015-node6

1
2
3
4
5
6
7
8
9
{
"presets": ["es2015-node6"],
"plugins": [
["transform-runtime", {
"polyfill": false,
"regenerator": false
}]
]
}

boilerplate

saucelabs-sample-test-frameworks/JS-Mocha-WebdriverIO-Selenium
Simple boilerplate project that runs multiple browser on SauceLabs in parallel.

  • Framework: Mocha
  • Features:
    • Page Object usage
    • Integration with SauceLabs

jonyet/webdriverio-boilerplate
Designed to be quick to get you started without getting terribly complex, as well as to share examples of how one can leverage external node modules to work in conjunction with wdio specs.

  • Framework: Mocha
  • Features:
    • examples for using Visual Regression testing with WebdriverIO v4
    • cloud integration with BrowserStack
    • Page Objects usage

cognitom/webdriverio-examples
Project with various examples to setup WebdriverIO with an internal grid and PhantomJS or using cloud services like TestingBot.

  • Framework: Mocha
  • Features:
    • examples for the tunneling feature from TestingBot
    • standalone examples
    • simple demonstration of how to integrate PhantomJS as a service so no that no Java is required

michaelguild13/Selenium-WebdriverIO-Mocha-Chai-Sinon-Boilerplate
Enhance testing stack demonstration with Mocha and Chai allows you to write simple assertion using the Chai assertion library.

  • Framework: Mocha
  • Features:
    • Chai integration
    • Babel setup

WillLuce/WebdriverIO_Typescript
This directory contains the WebdriverIO page object example written using TypeScript.

  • Framework: Mocha
  • Features:
    • examples of Page Object Model implementation
    • Intellisense

klamping/wdio-starter-kit
Boilerplate repo for quick set up of WebdriverIO test scripts with TravisCI, Sauce Labs and Visual Regression Testing

  • Framework: Mocha, Chai
  • Features:
    • Login & Registration Tests, with Page Objects
    • Mocha
    • Chai with expect global
    • Chai WebdriverIO
    • Sauce Labs integration
    • Visual Regression Tests
    • Local notifications
    • ESLint using Semistandard style
    • WebdriverIO tuned Gitignore file

How to use (Standalone Mode Vs WDIO Testrunner)

WebdriverIO可用于各种目的。它实现了Webdriver 协议 API和可以自动运行浏览器。框架设计可以在任意工作环境和任何类型的任务。
它是独立于任何第三方框架,只需要运行Nodejs

Standalone Mode

Standalone Mode是运行WebdriverIO的最简单的方法。和调用selenium-server-standaloneSelenium server file无关。
只需要require('webdriverio')在你的项目里,然后使用API运行你的automation。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var webdriverio = require('webdriverio');
var options = { desiredCapabilities: { browserName: 'chrome' } };
var client = webdriverio.remote(options);
client
.init()
.url('https://duckduckgo.com/')
.setValue('#search_form_input_homepage', 'WebdriverIO')
.click('#search_button_homepage')
.getTitle().then(function(title) {
console.log('Title is: ' + title);
// outputs: "Title is: WebdriverIO (Software) at DuckDuckGo"
})
.end();

WebdriverIOStandalone Mode允许集成自动化工具在你自己的项目中去创建新的自动化库。
例如ChimpCodeceptJS

The WDIO Testrunner

主要做大规模的e2e测试。因此,我们实现了一个帮助构建一个可靠的测试套件,更容易阅读和维护。
test runner负责处理通常会碰到的许多自动化库问题。它可以组织运行你的测试,使测试可以最大并发执行。
它还处理会话管理和提供了很多功能,帮助调试问题和发现测试中的错误。

1
2
3
4
5
6
7
8
9
10
11
describe('DuckDuckGo search', function() {
it('searches for WebdriverIO', function() {
browser.url('https://duckduckgo.com/');
browser.setValue('#search_form_input_homepage', 'WebdriverIO');
browser.click('#search_button_homepage');
var title = browser.getTitle();
console.log('Title is: ' + title);
// outputs: "Title is: WebdriverIO (Software) at DuckDuckGo"
});
});

wdio test runner使测试框架的抽象例如: Mocha, Jasmine , Cucumber
不同于使用Standalone Modewdio test runner执行的所有命令是同步的。这意味着你不再用Promise来处理异步代码。
使用wdio test runner查看文档Getting Started

Usage

Testrunner

Reporter

Services

Plugins

Examples