nightmare API 简单介绍

2016-04-18

nightmare 的 API 不是特别的多,平常使用比较多的主要是配置 nightmare 以及与页面交互的相关API,这里是官方给出的 nightmare 文档可以参考学习。

相关配置 API

API 描述
Nightmare(options) 初始化实例,options 为设置 Electron 浏览窗口的配置,参考文档
waitTimeout (default: 30s) wait 等待最长时间,超过这个时间还未返回,则抛出异常
paths 为 Electron 设置数据路径,参考文档
switches chrome 的一些配置,参考文档

以上的 API 均为 nightmare 初始化实例对象的配置,例如我们要配置浏览窗口的大小,如下所示:

var nightmare = new Nightmare({
width: 1000,
height: 800
show: true
});

与页面交互API

API 描述
.goto(url) 加载 url 页面
.back() 后退到前一页
.forward() 前进到下一页
.refresh() 刷新当前页
.click(selector) 点击selector元素
.mousedown(selector) 鼠标按下selector元素
.type(selector [, text]) 如果有text参数,则向 selector 输入 text,否则清空 selector , 并触发键盘事件
.insert(selector [, text]) 与type功能一致,但是不触发键盘事件,输入速度快于.type
.check(selector) 选中 selector checkbox
.uncheck(selector) 取消选中 selector checkbox
.select(selector,option) 选中 dropdown 的option选项
.scrollTo(top, left) 屏幕滚动
.viewport(width, height) 调整视窗大小
.inject(type, file) 注入本地的 js、css 文件
.evaluate(fn[, arg1, arg2]) 在页面中执行fn
.wait(ms | selector | fn) 等待ms秒, 等待 selector, 等待 fn
.exists(selector) selector 是否存在
.visible(selector) selector 是否是可见的
.on(event, callback) 捕获页面上的事件
.title() 返回当前页面的title
.url() 返回当前页面的url
.screenshot() 截图

上面的 API 都是与页面之间进行交互,其中有几个方法比较特别,将进一步对其介绍。

  • nightmare 的 .evaluate() 方法

evaluate(fn[, arg1, arg2 …]) 方法是在浏览器端执行 fn 函数,因此对 dom 节点的一些读写操作要使用 evaluate() 方法才行。

var Nightmare = require('nightmare');
var nightmare = new Nightmare({ show: true });
var content;
nightmare
.goto('https://example.com')
.evaluate(function(selector){
return document.querySelector(selector).textContent; // 返回dom节点信息
}, '.head')
.then(function(res) {
console.log(res); // 打印返回的节点信息
});

要注意以下几点: 首先,evaluate() 方法是在浏览器端执行 fn 函数,也就是说 fn 函数的执行环境是浏览器环境,而不是 node 环境,因此一些浏览器不支持的 ES6 特性,在 fn 函数中不要使用 其次,浏览器中的dom信息只能通过fn的返回值来获得,而提供给fn使用的数据只能通过参数传递,也就是说不要使用全局变量的方式进行数据传递

例如:

var Nightmare = require('nightmare'),
nightmare = new Nightmare({ show: true }),
content, // A
selector = '.head'; // B nightmare
.goto('https://example.com')
.evaluate(function(selector) {
let msg = 'test'; // 浏览器不支持的特性, 错误
content = document.querySelector(selector).textContent; // 使用 A, B 处定义的变量,错误
})
.then();

关于evaluate() 的坑

  • nightmare 的 .wait() 方法

wait() 方法的作用是等待某个事件发生,这些事件包括:一段时间结束、等待某个dom元素出现、等待某个函数执行完成。wait(fn) 方法与 evaluate(fn) 方法类似,fn 也是要在浏览器上执行,但是最后要返回 true 才能结束等待,最长的等待时间为 waitTimeout 设置的时长。

var Nightmare = require('nightmare');
var nightmare = Nightmare({ show: true }); nightmare
.goto('https://baidu.com')
.wait(function() {
// 在 baidu 的页面中绑定一个 dom 节点
var ndTest = document.createElement('p');
ndTest.innerHTML = 'This is test for nightmare\'s wait';
ndTest.className = 'test';
document.body.appendChild(ndTest);
return true;
})
.wait('.test')
.evaluate(function() {
// 返回节点文本信息
return document.querySelector('.test').textContent;
})
.then(function(res) {
console.log(res);
});
  • nightmare 的 .insert() 与 .type() 方法

两者都能向 web 页面的输入框输入信息,但是存在着一些差别。type() 再输入过程中触发键盘事件,而 insert() 不触发键盘事件,但是insert() 输入的速度要快一些。因此如果输入框要响应键盘输入的事件,这时就要 type()了。

总结

主要介绍 nightmare 的 API,nightmare 的配置参数主要分为三个方面:Electron 配置参数(nightmare 的底层是 Electron 框架)、Chrome 配置参数(Electron 使用了 Chrome 浏览器)以及自身的配置。nightmare 与外面的交互 API 可以分为两类:其一,操作类 API 如  wait、click、evaluate  等;其二,输出结果 API 如 title、exists 等。使用时最值得注意的就是 evaluate(),很容易出错。

nightmare API的更多相关文章

  1. On the nightmare that is JSON Dates. Plus, JSON.NET and ASP.NET Web API

    Ints are easy. Strings are mostly easy. Dates? A nightmare. They always will be. There's different c ...

  2. javascript的api设计原则

    前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...

  3. Nightmare基于phantomjs的自动化测试套件

    今天将介绍一款自动化测试套件名叫nightmare,他是一个基于phantomjs的测试框架,一个基于phantomjs之上为测试应用封装的一套high level API.其API以goto, re ...

  4. JavaScript API 设计原则

    网+线下沙龙 | 移动APP模式创新:给你一个做APP的理由>> 好的 API 设计:在自描述的同时,达到抽象的目标. 设计良好的 API ,开发者可以快速上手,没必要经常抱着手册和文档, ...

  5. e2e测试之Nightmare

    一.e2e测试简介 e2e或者端到端(end-to-end)或者UI测试是一种测试方法,它用来测试一个应用从头到尾的流程是否和设计时候所想的一样.简而言之,它从一个用户的角度出发,认为整个系统都是一个 ...

  6. nodejs爬虫笔记(四)---利用nightmare解决加载更多问题

    目标: 解决页面加载更多问题.笔记三中,我们只爬取到网页的部分信息,而点击加载更多后的页面内容是没有提取到的.开始我的想法是找到加载更多的数据接口(可参照:http://www.jianshu.com ...

  7. 基于nightmare的美团美食商家爬虫实践

    前言美团商家页分析需要爬取的数据有(这里没有按人数爬)爬虫工具选取pysipderscrapynightmare同步任务js动态加载中断继续爬坑总结示例代码 前言 上学的时候自己写过一些爬虫代码,比较 ...

  8. Nightmare安装and一个小例子

    前端的功能测试 官方说法A high-level browser automation library,翻译过来就是高级浏览器自动化库 常用于UI测试和爬网 功能测试必须在真正浏览器做,现在有四种方法 ...

  9. JavaScript API 设计准则

    好的 API 设计:在自描述的同时,达到抽象的目标. 设计良好的 API ,开发者可以快速上手,没必要经常抱着手册和文档,也没必要频繁光顾技术支持社区. 流畅的接口 方法链:流畅易读,更易理解 //常 ...

随机推荐

  1. centos服务器上git clone下载加速

    最近在服务器上直接git clone github上的仓库,下载速度只有十几KB,简直不要太慢! 网上搜了一些加速的,自己于是写了下面的总结. 1. nslookup命令 如果执行这个命令找不到,请先 ...

  2. C# 验证控件的使用RequiredFieldValidator&CompareValidator

    使用验证控件可以向服务器提交表单数据时验证表单内容,下面以RequiredFieldValidator和CompareValidator为例说明验证控件的用法 RequiredFieldValidat ...

  3. P1505 [国家集训队]旅游[树剖]

    题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路 ...

  4. jenkins生成的HTML报告中expand与collapse问题

    1.打开jenkins中脚本命令执行页面 2.在脚本命令页面的,输入框中粘贴 System.setProperty("hudson.model.DirectoryBrowserSupport ...

  5. MyBatis框架的搭建

    前言:MyBatis框架的前身是iBatis,本身是Apache的一个开源项目. MyBatis框架是一个半自动的orm映射框架,是实体类和sql语句之间建立映射关系,sql语句写在单独的配置文件中, ...

  6. HBase学习笔记之HBase的安装和配置

    HBase学习笔记之HBase的安装和配置 我是为了调研和验证hbase的bulkload功能,才安装hbase,学习hbase的.为了快速的验证bulkload功能,我安装了一个节点的hadoop集 ...

  7. php生成pdf,php+tcpdf生成pdf, php pdf插件

    插件例子:https://tcpdf.org/examples/ 下载tcpdf插件: demo // Include the main TCPDF library (search for insta ...

  8. Vue.directive全局自定义指令案例

    今天正好这个知识点有点淡忘了,就随笔一下吧: Vue.directive(参数1,参数2) 参数1:指令名称,如"drag" 参数2:指令要实现的回调函数,其中回调函数中也有两个参 ...

  9. 【批处理】set命令

    原文地址:https://www.cnblogs.com/Braveliu/p/5081084.html [1]set命令简介 set,设置. [2]set命令使用 1. 打印系统环境变量.set命令 ...

  10. zabbix值显示的问题

    虽然在创建监控项的时候,是可以选值类型的,目前有的是整型,浮点型,日志,文本,字符串.但是不要误认为zabbix采集数据的时候就是按照这个格式采集的. zabbix各种接口采集到的数据都是字符串类型, ...