一、nightmare

Nightmare 是一个基于 Electron 的框架,利用了 Electron 提供的 Browser 的环境,用于 Web 自动化测试和爬虫(其实爬虫这个是大家自己给这个框架加的功能),可以在页面上模拟用户的行为触发一些异步数据加载。

具体的安装使用方法见官网http://www.nightmarejs.org/ 。

小贴士:

二进制的 Electron 依赖有点大,安装时间比较长,可以参照https://blog.tomyail.com/install-electron-slow-in-china/ ,加速electron在国内的下载速度。

这里贴一个nightmare在github上的示例:

var Nightmare = require('nightmare');
var nightmare = Nightmare({ show: true });nightmare.goto('https://duckduckgo.com').type('#search_form_input_homepage', 'github nightmare').click('#search_button_homepage').wait('#zero_click_wrapper .c-info__title a').evaluate(function () {// 该环境中能使用浏览器中的任何对象window/document,并且返回一个promisereturn document.querySelector('#zero_click_wrapper .c-info__title a').href;}).end().then(function (result) {console.log(result);}).catch(function (error) {console.error('Search failed:', error);});

交互常用api

  • goto(url[,headers]) url为你要跳转的网站url
  • wait(selector) 等待某个dom元素出现
  • type(selector[,text]) 在selector元素中输入text文本
  • click(selector) 点击某个dom元素
  • evaluate(fn[,agr1,agr2,…]) 在客户端注入JS脚本并执行 也就是你自己要封装数据的代码
  • end() 执行完成,等待对数据的处理

由于在实际做爬虫项目时,发现框架自带的浏览器有兼容性导致页面无法正常加载,就没有采用这个框架,这里只做简单介绍,有兴趣的同学可以去官网详细了解。

二、nightwatch

什么是Nightwatch?

Nightwatch.js是一个使用Node.js编写的,用于Web应用程序和网站的自动化测试框架,和nightmare.js的不同之处在于它使用W3C WebDriver API来驱动浏览器,以便对DOM元素执行命令和断言。

在大多数情况下,Nightwatch至少需要向WebDriver服务器发送2个请求才能执行命令或声明,第一个请求是在给定CSS选择器(或Xpath表达式)的情况下定位元素的请求,下一个要执行的请求给定元素上的实际命令/声明。

Nightwatch有两种方式去调起浏览器跑测试
1、通过Selenium,调各个浏览器的webDriver唤起浏览器。这个需要安装java、Selenium、webDriver
2、直接通过各家浏览器的webDriver调起对应的浏览器

我选择了第二种,这里就需要去安装的chrome的webDriver,npm i -D chromedriver

具体的安装使用配置方法见官网https://nightwatchjs.org/ 。

在做爬虫项目中的核心代码:

module.exports = {'step one': function(browser) {browser.url('https://www.facebook.com/').waitForElementVisible('#login_form').setValue('#email', 'account').setValue('#pass', 'password').click('#loginbutton').waitForElementVisible('#userNav')},'step two': function(browser) {browser.url('https://www.###.com/search/groups/?q=vaping&epa=SERP_TAB').waitForElementVisible('#BrowseResultsContainer', 5000, 'the page is loaded').timeoutsAsyncScript(600000, function(result) {console.log(result);}).executeAsync(function(successResults, done) {new Promise(function(resolve, reject) {if (/* 异步操作成功 */) {resolve();}}).then(function(){//处理一些数据 data});done(data);//异步操作结束执行}, [successResults], function(results) {//results.value === data;});},'step three': (browser) => {browser.end();}
};

用到的api:

  • url([url], [callback]) 检索当前页面的URL或导航到新URL
  • waitForElementVisible([using], selector, [timeout],[message]) 元素在指定的时间内可见
  • setValue(selector, inputValue, [callback]) 在selector元素中输入inputValue
  • click(selector, [callback]) 点击某个dom元素,支持回调
  • timeoutsAsyncScript(ms, [callback]) 设置.executeAsync执行的异步脚本在中止之前运行的时间(以毫秒为单位)
  • execute(script, args, [callback] ) 在页面中注入一段JavaScript,假定执行的脚本是同步的
  • executeAsync( script, args, [callback] ) 在页面中注入一段JavaScript,假定执行的脚本是异步的

在做项目时文档没细看,拿到execute( )就开始编码,导致掉在坑里一直出不来,这里就重点说下execute( ) executeAsync( )这两个api的具体用法。

this.demoTest = function (browser) {browser.execute(function(arg1, arg2,) {//......return data;}, [arg1, arg2,], function(result) {// result.value === data});
}
this.demoTest = function (browser) {browser.executeAsync(function(arg1, arg2, done) {setTimeout(function() {done(data);}, 500);}, [arg1, arg2], function(result) {// result.value === data});
}

execute(script, args, [callback] ) executeAsync( script, args, [callback] ) 这两个api 注入的JavaScript代码是运行在浏览器端的,而浏览器端和客户端的通信很有必要,比如我们可能需要使用在客户端声明的全局变量,以及把在浏览器端得到的数据传递给客户端。

args会以数组的形式把来自客户端的变量作为参数传递给script 函数体作为参数使用,并且该函数体返回的值将返回给客户端。

不同点在于,executeAsync( )执行的是异步脚本,script函数体将done回调作为参数接收,异步操作完成后需要调用该回调。传递给done回调的值将返回给客户端,具体使用方法见上面的示例代码。

切记,切记,如果注入的JavaScript脚本里包含异步操作,一定要使用executeAsync( ),而非execute( )。

后记

这里我只是简单介绍一下nightwatch,更加详细具体的使用还是需要参考[官方文档](https://nightwatchjs.org/](https://nightwatchjs.org/)。
怎么修改浏览器的默认行为(比如弹出的订阅通知弹窗)还尚待解决,欢迎了解的小伙伴伴留言哈。

初探自动化测试(爬虫)框架nightmarenightwatch相关推荐

  1. 初探Scrapy爬虫框架之百度网页爬取

    初探Scrapy爬虫框架之百度网页爬取 scrapy框架及百度网页爬取与保存 一.scrapy框架简介 二.自己初使用的心得体会 1.爬虫之前明确目标 2.scrapy框架的简单使用流程 3.scra ...

  2. python 爬虫框架_小白学 Python 爬虫(28):自动化测试框架 Selenium (下)

    人生苦短,我用 Python 如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,您的关注,是对小编坚持原创的最大鼓励:) 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Py ...

  3. python 爬取道客巴巴文档_Python常用的几个高效率的爬虫框架

    1.Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.用这个框架可以轻松爬下来如亚马逊商品信息之类的数 ...

  4. python爬虫框架排行榜-常用python爬虫框架整理

    Python中好用的爬虫框架 一般比价小型的爬虫需求,我是直接使用requests库 + bs4就解决了,再麻烦点就使用selenium解决js的异步 加载问题.相对比较大型的需求才使用框架,主要是便 ...

  5. python爬虫框架排行榜-哪种Python框架适合你?简单介绍几种主流Python框架

    众所周知,Python开发框架大大减少了开发者不必要的重复劳动,提高了项目开发效率的同时,还使得创建的程序更加稳定.目前比较主流的Python框架都有哪些呢?一般大家用的比较多的是Django.Fla ...

  6. java 爬虫框架_不知道Python爬虫?这篇文章丢给他(内含框架结构)

    前言 爬虫即网络爬虫,英文是Web Spider.翻译过来就是网络上爬行的蜘蛛,如果把互联网看作一张大网,那么爬虫就是在大网上爬来爬去的蜘蛛,碰到想要的食物,就把他抓取出来. 我们在浏览器中输入一个网 ...

  7. python流行的爬虫框架_Python爬虫相关框架

    Python爬虫相关框架,Python的爬虫框架就是一些爬虫项目的半成品.比如我们可以将一些常见爬虫功能的实现代码写好,然后留下一些接口,在做不同的爬虫项目时,我们只需要根据实际情况,只需要写少量需要 ...

  8. 动态IP代理软件有话说:天下爬虫框架皆出Scrapy

    针对规模小.抓取数据量小.对抓取速度不比较敏感的爬虫软件, 应用 Requests 能轻轻松松拿下.这种网页爬虫关键作用是抓取网页页面.轻松玩网页页面.假如人们必须抓取网站及其系列产品网上平台,要求网 ...

  9. 8个高效的Python爬虫框架分享

    Python是一门优雅的编程语言,被广泛应用在Web开发.游戏开发.人工智能.云计算开发.大数据开发.数据分析.科学运算.爬虫.自动化运维.自动化测试等领域.Python在各领域的应用最方便的就是使用 ...

  10. python 爬虫框架_Python常用的几个高效率的爬虫框架

    1.Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.用这个框架可以轻松爬下来如亚马逊商品信息之类的数 ...

最新文章

  1. LeetCode简单题之数组的相对排序
  2. 基带信号传输之信道均衡
  3. 光遇自动弹琴脚本代码_光遇弹琴辅助软件下载-光遇自动弹琴脚本代码下载v1.0_86PS软件园...
  4. Linux系统分析之启动流程
  5. 在linux kernel中netlink的使用示例
  6. hdu 1003 A + B Problem II 使用整型数组轻松实现大数求和
  7. 给中国学生的第五封信 – 你有选择的权利
  8. vscode代码库登录配置_VSCode 配置 Sonar Lint支持代码检查提效
  9. 为什么拙劣的软件也会成功?
  10. SpringBoot文件上传大小设置(yml中配置)
  11. GitHub如何在README.md文件中插入图片
  12. Linux搜寻文件或目录命令解析
  13. 2台mysql集群_如何安装配置基于2台服务器的MySQL集群
  14. Qt Designer设计 UI 文件并调用
  15. Web Server与App Server
  16. CentOS7增加或修改SSH端口号
  17. c4isr系统有无服务器,什么是C4ISR系统?
  18. 网络安全 Windows用户密码破解 使用破解MD5值的在线网站和监听工具Cain
  19. DropdownMenu 下拉菜单的使用
  20. [sensorhub]MT6752/32平台sensor hub KK和L版本配置方法

热门文章

  1. 433_ev1527发送端驱动
  2. 计算机网络:CSMA/CA协议
  3. 更高的抵押贷款利率对美国房地产市场意味着什么?
  4. 微信小程序 button 按钮
  5. 入侵检测与防御技术基础
  6. Matlab中meshgrid的用法简介
  7. 通过sql注入窃取用户数据库信息
  8. OCR财务报表识别方案应用
  9. CTP开发(1)CTP开发的概述
  10. 韩信点兵C语言实现的几种方法