博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node+Nightmare超爽浏览器自动化开发
阅读量:6413 次
发布时间:2019-06-23

本文共 2566 字,大约阅读时间需要 8 分钟。

hot3.png

缘起

一直想做一个无界面浏览器自动化的工具,用来实现三个小目标:

  • 完善的CSS,JS,SVG支持,抓取渲染后的页面,实现截图
  • 实现必要的页面交换,比如按钮点击,表单填写
  • 无界面运行,跨平台

一通搜索之后,真的很详细了,列出了各种语言实现的无界面浏览器,基本都没有用过,只能根据开发的活跃度和github的星星数做一个简单筛选, Phantomjs和Nightmare进入了候选。Phantomjs之前接触过,思路还是很直接的,就是用js驱动webkit浏览器核心,星星1w+了,挺靠谱的应该。但是API真的比较原始,Nightmare最初应该是对Phantomjs的一次封装,从零星的网络介绍文章可以了解到这一点。上github主页看了看,8千多的星星,也不错。另外一个重大发现是已经和Phantomjs分道扬镳了,用了Electron这个当红炸子鸡,Phantomjs俨然被它推到了对立面,主页上正是两个工具的代码对比:

phantom.create(function (ph) {  ph.createPage(function (page) {    page.open('http://yahoo.com', function (status) {      page.evaluate(function () {        var el =          document.querySelector('input[title="Search"]');        el.value = 'github nightmare';      }, function (result) {        page.evaluate(function () {          var el = document.querySelector('.searchsubmit');          var event = document.createEvent('MouseEvent');          event.initEvent('click', true, false);          el.dispatchEvent(event);        }, function (result) {          ph.exit();        });      });    });  });});

看着嵌套,唉,是不是有点晕了。再看Nightmare的:

yield Nightmare()  .goto('http://yahoo.com')  .type('input[title="Search"]', 'github nightmare')  .click('.searchsubmit');

是不是很简单?!

另外,安装也很简洁,npm install nightmare 墙内的朋友如果npm安装不成功,就试试cnpm吧,安装 请看:

小试牛刀

因为nightmare是node驱动其工作,npm init 创建项目后,添加nightmare依赖,就可以开始编写node脚本,驱动Electron浏览器干活啦。登陆OSC,只需几行代码搞定:

var Nightmare = require('nightmare');var nightmare = Nightmare({ show: false });nightmare  .goto('https://www.oschina.net/')  .wait('footer')  .exists('div.user-info')  .then(function (result) {        if(!result)    {      return nightmare        .goto("https://www.oschina.net/home/login")        .wait("div.login-form")        .type("#userMail","红薯@oschina.net")        .type("#userPassword","hahaha")        .click("button.btn-login")        .wait(5000)        .exists("div.user-info")    }    else    {      console.log("已经是登陆状态了,不用登陆");      return nightmare.end();        }  })  .then(function(result) {      if(result && result == true)      {        console.log("登陆成功!")        return nightmare.end();      }      else      {        console.error('登陆失败');      }  })  .catch(function (error) {    console.error('异常:', error);  });

是不是代码都通俗易懂?

深入了解

文档已经比较清楚了: 另外再看看几个例子:

调试

个人在选型的时候,会很在意调试是否方便,不能断点调试的,都会自动进入待定区,打上一个问号。Nightmare,配合VSCode,调试实在太方便。

  • 直接F5,选Nodejs脚本,然后配置下launch.js里的入口文件,设置断点
  • var nightmare = Nightmare({ show: true}); //true表示显示Electron浏览器
  • 启动调试,浏览器就跳出来了,按照脚本一步步运行,在断点就停下来了

结束语

本人接触Nightmare也就3天时间,深感这是一个好用的工具,又觉得中文的介绍都很旧了,所以写下这篇博文,希望抛砖引玉,大家共同研究,一起提高!

转载于:https://my.oschina.net/u/248080/blog/804746

你可能感兴趣的文章
工信部:云计算将成新一代信息技术发展重点
查看>>
配置SCCM 2012 SP1(六)发布应用程序
查看>>
《safe+》离线密码更安全,一键修改最方便
查看>>
正则表达式简明参考
查看>>
两数组最小距离问题
查看>>
DB2各版本下载地址
查看>>
老李秘技:loadrunner回放脚本错误提示Error: "HTTP Status-Code 500"
查看>>
配置iscsl服务,编写udev规则,配置并访问NFS共享,配置FreeNAS服务
查看>>
java后台框架 springmvc mybatis(sqlsever oracle 和 mysql数据库) HTML5 bootstrap 全新高大尚...
查看>>
ReportNG 支持中文处理技巧
查看>>
Java 面向对象 之 多态实例2
查看>>
Linux 的发展基本知识及哲学思想
查看>>
PHP 随机用户名账号的生成
查看>>
地址解析协议ARP
查看>>
RC 和 Beta认识
查看>>
输入一串随机数字,然后按千分位输出。
查看>>
流程控制案例
查看>>
进程与线程
查看>>
linux部署时间服务器出现错误no server suitable for synchronization found
查看>>
日志备份和按时间删除日志脚本实现
查看>>