nightmare API
nightmare API 简单介绍
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();
- 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的更多相关文章
- 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 ...
 - javascript的api设计原则
		
前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...
 - Nightmare基于phantomjs的自动化测试套件
		
今天将介绍一款自动化测试套件名叫nightmare,他是一个基于phantomjs的测试框架,一个基于phantomjs之上为测试应用封装的一套high level API.其API以goto, re ...
 - JavaScript API 设计原则
		
网+线下沙龙 | 移动APP模式创新:给你一个做APP的理由>> 好的 API 设计:在自描述的同时,达到抽象的目标. 设计良好的 API ,开发者可以快速上手,没必要经常抱着手册和文档, ...
 - e2e测试之Nightmare
		
一.e2e测试简介 e2e或者端到端(end-to-end)或者UI测试是一种测试方法,它用来测试一个应用从头到尾的流程是否和设计时候所想的一样.简而言之,它从一个用户的角度出发,认为整个系统都是一个 ...
 - nodejs爬虫笔记(四)---利用nightmare解决加载更多问题
		
目标: 解决页面加载更多问题.笔记三中,我们只爬取到网页的部分信息,而点击加载更多后的页面内容是没有提取到的.开始我的想法是找到加载更多的数据接口(可参照:http://www.jianshu.com ...
 - 基于nightmare的美团美食商家爬虫实践
		
前言美团商家页分析需要爬取的数据有(这里没有按人数爬)爬虫工具选取pysipderscrapynightmare同步任务js动态加载中断继续爬坑总结示例代码 前言 上学的时候自己写过一些爬虫代码,比较 ...
 - Nightmare安装and一个小例子
		
前端的功能测试 官方说法A high-level browser automation library,翻译过来就是高级浏览器自动化库 常用于UI测试和爬网 功能测试必须在真正浏览器做,现在有四种方法 ...
 - JavaScript API 设计准则
		
好的 API 设计:在自描述的同时,达到抽象的目标. 设计良好的 API ,开发者可以快速上手,没必要经常抱着手册和文档,也没必要频繁光顾技术支持社区. 流畅的接口 方法链:流畅易读,更易理解 //常 ...
 
随机推荐
- 51nod 2500 后面第一个大于
			
小b有一个长度为n的序列t,现在她对于每个i,求最小的正数j满足i+j≤ni+j≤n且ti+j>titi+j>ti,输出j,如果不存在这样的j,则输出0. 样例解释: 对于i=1,t2&g ...
 - test20190924 老L
			
80+50+100=230.T1没做出来说明我数列学得不好? LOLO 的含树 现有函数 \[ g_m(i)=\begin{cases} 0, & 0 \leq i \leq m\\ i-1+ ...
 - docker-compose部署zabbix4.2.5
			
桥接模式(mysql和zabbix-server镜像本人修改了一些配置进行重构过) cat zabbix.yml version: '3' services: mysql: image: debian ...
 - AOP_原理
			
什么是AOPAOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封 ...
 - [Codeforces 1242C]Sum Balance
			
Description 题库链接 给你 \(k\) 个盒子,第 \(i\) 个盒子中有 \(n_i\) 个数,第 \(j\) 个数为 \(x_{i,j}\).现在让你进行 \(k\) 次操作,第 \( ...
 - 2020年假期sql excel文件 获取
			
下载地址: https://files.cnblogs.com/files/shmily3929/2020.zip 说明:sql 不区分节假期和周六周末 excel文件区分节假日和周六周末
 - 关于System.ExecutionEngineException异常
			
什么是System.ExecutionEngineException 公共语言运行库的执行引擎中出现内部错误时引发的异常.这个类不能继承. 继承 Object Exception SystemExce ...
 - c++ Size capacity Resize reserve shrink_to_fit
 - Codeforces 1163E Magical Permutation [线性基,构造]
			
codeforces 思路 我顺着图论的标签点进去的,却没想到-- 可以发现排列内每一个数都是集合里的数异或出来的. 考虑答案的上界是多少.如果能用小于\(2^k\)的数构造出\([0,2^k-1]\ ...
 - 深度讨论i++问题
			
例题1:下列程序的输出结果是多少? public class Test { static { int x = 5; } static int x, y; public static void main ...