e2e自动化之Nightwatch

项目地址

前言

怎么说呢?本司之前用的是selenium Java写的前端自动化。倒也是我写了。不过为什么会想着Nightwatch呢?因为有一天发现自动化挂了。一查看才发现前端加了个蒙板。结果导致xpath变了,然后导航页点击挂了(不能点到导航页,也就进不了具体页面)。改了下倒也不麻烦,但是导runable jar包没给折腾死。实在太多了。
想着如今js也是很强的,就找到了Nightwatch。为什么不用phantomjs?因为用的时候觉得API实在是有点不够用。而且无界面化别人觉得不靠谱(人家觉得眼见为实)。

Nightwatch phantomjs
有界面 无界面
API丰富 API有点不够用

selenium与nightwatch

Selenium是一个用于Web应用程序测试的工具,nightwatch其实有点像是调用selenium干活一样。只是使用nightwatch做中转和直接使用selenium相比,前者很是轻松易上手。

准备

Java

Java环境是必须的。百度下jdk安装教程数不胜数,在此不赘述。

node.js

node.js环境也是需要的,记得早年npm与nodejs得分开安装,现在却是不用了。官网下载无脑安装即可。

selenium

需要浏览器驱动和selenium server.jar
server.jar下载地址
driver下载地址
得下载和浏览器相匹配的driver。去chromedriver.storage.googleapis.com,点进最新版,查看notes.txt即可看见支持情况。就比如此时最新版为2.33。
https://chromedriver.storage.googleapis.com/2.33/notes.txt
这里提供下chromedriver与chrome版本对照表

chromedriver chrome
v2.33 v60-62
v2.32 v59-61
v2.31 v58-60
v2.30 v58-60
v2.29 v56-58
v2.28 v55-57
v2.27 v54-56
v2.26 v53-55
v2.25 v53-55
v2.24 v52-54
v2.23 v51-53
v2.22 v49-52
v2.21 v46-50
v2.20 v43-48
v2.19 v43-47
v2.18 v43-46

正文

环境准备就绪,开始撸代码。

简化

首先建立项目,比如nightwatch,在位于当前文件夹的终端/命令行敲入

npm init -y

初始化完成之后输入

npm install --save nightwatch

安装nightwatch依赖
新建nightwatch.json(此文件名不能修改),以下注释了些常用关键项,千万记得实际上这是个JSON文件,不能有注释,自行去掉。更多配置项请看官网,无需找中文版,因为英语很浅显。

{
    "src_folders": [
        "tests" //存放测试用例的文件夹,文件夹不可嵌套
    ],
    "output_folder": "reports",  //存放测试报告文件夹
    "custom_commands_path": "",
    "custom_assertions_path": "",
    "page_objects_path": "",
    "globals_path": "",
    "selenium": {
        "start_process": true,//是否自动开启selenium服务
        "server_path": "./selenium-server-standalone-3.7.1.jar",//selenium jar路径
        "log_path": "",
        "port": 4444,
        "cli_args": {
            "webdriver.chrome.driver": "./chromedriver",  //driver路径
            "webdriver.gecko.driver": "",
            "webdriver.edge.driver": ""
        }
    },
    "test_settings": {
        "default": {
            "launch_url": "http://localhost",
            "selenium_port": 4444,
            "selenium_host": "localhost",
            "silent": true,
            "screenshots": {
                "enabled": true,//是否开启截图,若为false,截图不成功
                "path": ""
            },
            "desiredCapabilities": {
                "browserName": "chrome",//默认使用什么浏览器测试
                "marionette": true
            }
        },
        "chrome": {
            "desiredCapabilities": {
                "browserName": "chrome"
            }
        },
        "edge": {
            "desiredCapabilities": {
                "browserName": "MicrosoftEdge"
            }
        }
    }
}

新建start.js(此文件为启动文件,所以可以随意命名)

require('nightwatch/bin/runner.js')

自此,环境搭建完毕。可以写测试用例
我们新建一个tests文件夹存储测试用例。新建一个./tests/test.js

module.exports = {
    'Search by baidu': function (client) {
        // 定义页面元素
        const searchInput = '#kw';
        const searchBtn = '#su';
        const resultContainer = '#container';
        // 启动浏览器并打开www.baidu.com
        client.url('http://baidu.com').maximizeWindow()
            // 确保输入框可以使用.
            .waitForElementVisible(searchInput, 5000)
            // 输入"nightwatch"然后搜索.
            .setValue(searchInput, 'nightwatch')
            .click(searchBtn)
            .waitForElementVisible(resultContainer, 1000)
            // 截屏 
            .saveScreenshot('reports/answers.png')
            .end()
    }
}

相信这个用例大家都看得懂。
然后终端输入

node ./start.js

效果如下(简书对GIF大小有限制,就截了部分):


效果图.gif

改装

上面我们是事先下载好selenium driver与jar包。其实我们可以使用selenium-standalone这个安装器(需要翻墙)
首先安装依赖

nom install --save-dev selenium-standalone

其次,新建selenium文件夹。在此文件夹下新建selenium-conf.js

const process = require('process')
module.exports = {
    // selenium版本与下载地址
    // check for more recent versions of selenium here:
    // https://selenium-release.storage.googleapis.com/index.html
    version: '3.7.1',
    baseURL: 'https://selenium-release.storage.googleapis.com',
    // Driver看情况配置,比如只需要chrome就止血chrome 即可
    drivers: {
        chrome: {
            // check for more recent versions of chrome driver here:
            // https://chromedriver.storage.googleapis.com/index.html
            version: '2.33.2',
            arch: process.arch,
            baseURL: 'https://chromedriver.storage.googleapis.com'
        },
        ie: {
            // check for more recent versions of internet explorer driver here:
            // https://selenium-release.storage.googleapis.com/index.html
            version: '3.0.1',
            arch: process.arch,
            baseURL: 'https://selenium-release.storage.googleapis.com'
        }
    }
}

新建setup.js文件

const selenium = require('selenium-standalone')
const seleniumConfig = require('./selenium-conf.js')
// 从网络下载selenium
selenium.install({
    version: seleniumConfig.version,
    baseURL: seleniumConfig.baseURL,
    drivers: seleniumConfig.drivers,
    logger: function (message) { console.log(message) },
    progressCb: function (totalLength, progressLength, chunkLength) { }
}, function (err) {
    if (err) throw new Error(`Selenium 安装错误: ${err}`)
    console.log('Selenium 安装完成.')
})

运行setup.js即可安装

node ./selenium/setup.js

大坑

为什么是大坑呢?因为老夫Google,逛了好些国外论坛,看了源码都没搞定下面这货。


先说下原因。都是因为我chromedriver版本与我机子chrome版本不对应。对应表格请看上文
虽然解决了,但是还是说下我的爬坑路。
首先第一想法是参数问题,学过Java的朋友应该知道,Java启用selenium可以设置参数来解决这个问题,不怎么用Java selenium,这里就度娘了一篇
按照这个思路,那必定是在nightwatch.json里填参数。官网找了圈没找到,就google了下,如下:

"chrome": {
    "desiredCapabilities": {
        "browserName": "chrome",
        "chromeOptions": {
            "args": [
                "disable-web-security",
                "ignore-certificate-errors"
            ]
        }
    }
}

发现还真可以消除这个ignore-certificate-errors,但是却不能打开网页。
百般无奈之下,看源码,定位到


selenium.js

打印this.cliOpts参数可见


参数

当然,因为不是很清楚这个对应的参数应该怎么写,自然没成功。知道的朋友望告知一声。

后记

有空写个selenium Java时遇到的一些问题以及解法。比如滚动截屏的Javashi xian

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容