Node+Nightmare超爽浏览器自动化开发

2019独角兽企业重金招聘Python工程师标准>>> 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吧,安装 请看:https://npm.taobao.org/

小试牛刀

因为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);
  });

是不是代码都通俗易懂?

深入了解

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

调试

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

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

结束语

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

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

你可能感兴趣的:(Node+Nightmare超爽浏览器自动化开发)