PhantomJS - 快速指南


PhantomJS - 概述

PhantomJS被称为无头浏览器,因为在执行 JavaScript 代码时没有浏览器的参与。执行不会在浏览器显示中看到,而是在命令行提示符中看到。CSS 处理、DOM 操作、JSON、Ajax、Canvas、SVG等功能都将在命令提示符下处理。PhantomJS 没有 GUI,因此它的所有执行都在命令行中进行。

使用 PhantomJS,我们可以写入文件、读取文件内容或上传文件、截屏、将网页转换为 pdf 等等。使用无头浏览器,您可以获得所有浏览器Behave(即Cookie)、Http 请求方法(即GET /POST)、清除 Cookie、删除 Cookie等、重新加载页面、导航到不同页面

PhantomJS使用WebKit,它具有与著名浏览器类似的浏览环境——Google Chrome、Mozilla Firefox、Safari等。它还提供了大量的JavaScript API,有助于截屏、上传文件、写入文件、读取文件、与网页交互等。

PhantomJS 不支持 Flash 或 Video,因为它需要插件,并且很难在命令行上支持相同的功能。

PhantomJS的特点

现在让我们了解 PhantomJS 提供的功能。

页面自动化

PhantomJS 允许您借助其 API 读取页面内容。它可以帮助操作 DOM,使用外部库来执行所需的任务。

屏幕截图

PhantomJS 有助于截取指定页面的屏幕截图,并将其保存为各种格式的图像,如 PNG、JPEG、PDF 和 GIF。借助屏幕截图,可以轻松帮助确保网页内容良好。

PhantomJS 提供属性和方法,允许开发人员调整屏幕截图的大小并指定他们想要捕获的区域。

无头测试

PhantomJS 有助于在命令行测试 UI。同时,借助屏幕截图,可以轻松帮助查找 UI 中的错误。PhantomJS 有时无法单独帮助测试。但是,它可以与其他测试库(如 Mocha、Yoeman 等)一起包装。您可以借助 PhantomJS 上传文件并提交表单。

PhantomJS 可用于测试跨站点的登录并确保安全性不会受到损害。PhantomJS可以与CasperJS、Mocha、Qunit等其他工具一起使用,使测试更加强大。

网络监控

PhantomJS 的重要功能之一是使用可用的 API 来监控网络连接。PhantomJS 允许检查网络流量;适合对网络Behave和性能进行各种分析。

PhantomJS 可用于收集有关实时环境中网页性能的数据。PhantomJS 可以与Yslow等工具一起使用来收集任何网站的性能指标。

PhantomJS - 环境设置

PhantomJS 是一款免费软件,根据BSD 许可证分发。它易于安装,并提供多种执行脚本的功能。PhantomJS可以轻松运行在Windows、Linux、Mac等多种平台上。

要下载 PhantomJS,您可以访问 – http://phantomjs.org/,然后单击下载选项。

对于 Windows

下载页面显示了不同操作系统的下载选项。下载 zip 文件,解压它,您将获得一个可执行文件phantom.exe。将 PATH 环境变量设置为 phantom.exe 文件的路径。打开新的命令提示符并输入phantomjs –v。它应该为您提供正在运行的 PhantomJS 的当前版本。

对于 MAC OS X

下载适用于 MAC OS 的 PhantomJS zip 文件并解压内容。下载内容后,将 PhantomJS 移动到 – /usr/local/bin/。在终端执行 PhantomJS 命令 phantomjs –v ,它应该会给你 PhantomJS 的版本描述。

Linux 64 位

下载适用于 Linux 64 位的 PhantomJS zip 文件并解压内容。下载内容后,将 PhantomJS 文件夹移动到/usr/local/share/创建一个符号链接-

sudo mv $PHANTOM_JS /usr/local/share 
sudo ln -sf /usr/local/share/$PHANTOM_JS/bin/phantomjs /usr/local/bin.

在终端执行 phantomjs –v ,它应该给出 PhantomJS 的版本。

Linux 32 位

下载适用于 Linux 32 位的 PhantomJS zip 文件并解压内容。下载内容后,将 PhantomJS 文件夹移动到/usr/local/share/并创建一个符号链接 -

sudo mv $PHANTOM_JS /usr/local/share 
sudo ln -sf /usr/local/share/$PHANTOM_JS/bin/phantomjs /usr/local/bin.

在终端执行 phantomjs –v ,它应该给出 PhantomJS 的版本。

PhantomJS 源代码也可以通过单击以下链接从 git 存储库获取 – https://github.com/ariya/phantomjs/

要在 PhantomJS 中运行脚本,命令如下 -

phantomjs jsfile arg1 arg2… 

PhantomJS - 对象

在本章中,我们将了解 PhantomJS 的四个重要对象。它们如下 -

  • 启用 Cookie
  • cookie
  • 库路径
  • 版本

现在让我们详细讨论其中的每一个。

cookies启用

它告诉我们 cookie 是否启用。如果是,它将返回true ;否则为

句法

其语法如下 -

phantom.cookiesEnabled

例子

cookieenabled.js

phantom.addCookie ({  
   //adding cookie with addcookie property 
   name: 'c1', 
   value: '1', 
   domain: 'localhost' 
}); 

console.log("Cookie Enabled value is : "+phantom.cookiesEnabled); 
phantom.exit();

输出

命令- phantomjs cookieenabled.js

Cookie Enabled value is : true 

cookie

它有助于向域添加和设置 cookie。它返回一个对象,其中包含该域可用的所有 cookie。

句法

其语法如下 -

phantom.cookies; 

例子

文件名: phantomcookie.js

phantom.addCookie ({ 
   name: 'c1', 
   value: '1', 
   domain: 'localhost' 
}); 
phantom.addCookie ({ 
   name: 'c2', 
   value: '2', 
   domain: 'localhost' 
}); 
phantom.addCookie ({ 
   name: 'c3', 
   value: '3', 
   domain: 'localhost' 
}); 
console.log(JSON.stringify(phantom.cookies)); 
phantom.exit();

输出

命令- phantomjs phantomcookie.js

[{"domain":".localhost","httponly":false,"name":"c3","path":"/","secure":false, " 
value":"3"},{"domain":".localhost","httponly":false,"name":"c2","path":"/","sec u 
re":false,"value":"2"},{"domain":".localhost","httponly":false,"name":"c1","pat h
":"/","secure":false,"value":"1"}]

在上面的示例中,我们向 localhost 域添加了一些 cookie。然后我们使用phantom.cookies获取它。它通过使用JSON stringify方法将 JavaScript 对象转换为字符串,返回一个包含所有 cookie 的对象。您还可以使用foreach来访问 cookie 的名称/值。

库路径

PhantomJSlibraryPath存储injectJS方法要使用的脚本路径。

句法

其语法如下 -

phantom.libraryPath 

例子

这是一个查找版本的示例。

var webPage = require('webpage');
var page = webPage.create();

page.open('http://www.tutorialspoint.com/jquery', function(status) {
   if (status === "success") { 
      page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js ', function() { 
         if (page.injectJs('do.js')) { 
            // returnTitle is a function loaded from our do.js file - see below 
            return returnTitle(); 
         });
         
         console.log(title); 
         phantom.exit(); 
      } 
   } 
});

window.returnTitle = function() { 
   return document.title;
}; 

上述程序生成以下输出

Jquery Tutorial

版本

它给出正在运行的 PhantomJS 的版本并返回对象中的详细信息。例如:{“主要”:2,“次要”:1,“补丁”:1}

句法

其语法如下 -

phantom.version

例子

这是一个查找版本的示例。

var a = phantom.version;
console.log(JSON.stringify(a));
console.log(a.major);
console.log(a.minor);
console.log(a.patch);
phantom.exit();

上述程序生成以下输出

{"major":2,"minor":1,"patch":1} 
2 
1 
1

在上面的示例中,我们使用console.log来打印版本。目前,我们正在版本 2 上运行。它返回对象,其详细信息如上面的代码块所示。

PhantomJS - 方法

PhantomJS 是一个无需浏览器即可帮助执行 JavaScript 的平台。为此,使用以下方法,有助于添加 Cookie、删除、清除、退出脚本、注入 JS 等。

我们将在本章中详细讨论这些 PhantomJS 方法及其语法。网页模块中也有类似的方法addcookie、injectjs ,这些方法将在后续章节中讨论。

PhantomJS 公开了以下方法,可以帮助我们在没有浏览器的情况下执行 JavaScript -

  • 添加Cookie
  • 清除Cookie
  • 删除Cookie
  • 出口
  • 注入JS

现在让我们通过示例详细了解这些方法。

添加Cookie

addcookie方法用于添加cookie并存储在数据中。它与浏览器存储它的方式类似。它需要一个参数,该参数是一个具有 cookie 所有属性的对象,其语法如下所示 -

句法

其语法如下 -

phantom.addCookie ({ 
   "name" : "cookie_name",  
   "value" : "cookie_value", 
   "domain" : "localhost" 
});

名称、值、域是要添加到 addcookie 函数中的强制属性。如果 cookie 对象中缺少任何此属性,则此方法将失败。

  • name - 指定 cookie 的名称。

  • value - 指定要使用的 cookie 的值。

  • - cookie 将应用到的域。

例子

这是addcookie方法的示例。

var page = require('webpage').create(),url = 'http://localhost/tasks/a.html'; 
page.open(url, function(status) { 
   if (status === 'success') {     
      phantom.addCookie({   //add name cookie1 with value = 1 
         name: 'cookie1', 
         value: '1', 
         domain: 'localhost' 
      }); 
      phantom.addCookie({   // add cookie2 with value 2 
         name: 'cookie2', 
         value: '2', 
         domain: 'localhost' 
      }); 
      phantom.addCookie({   // add cookie3 with value 3 
         name: 'cookie3', 
         value: '3', 
         domain: 'localhost' 
      }); 
      console.log('Added 3 cookies'); 
      console.log('Total cookies :'+phantom.cookies.length);  
      
      // will output the total cookies added to the url.    
   } else { 
      console.error('Cannot open file'); 
      phantom.exit(1); 
   } 
}); 

例子

a.html

<html>
   <head>
      <title>Welcome to phantomjs test page</title>
   </head>
   
   <body>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
   </body>
</html>

上述程序生成以下输出

Added 3 cookies 
Total cookies :3

代码注释是不言自明的。

清除Cookies

此方法允许删除所有 cookie。

句法

其语法如下 -

phantom.clearCookies();

此概念的工作原理类似于通过在浏览器菜单中进行选择来删除浏览器 cookie。

例子

这是clearCookies方法的示例。

var page = require('webpage').create(),url = 'http://localhost/tasks/a.html'; 
page.open(url, function(status) { 
   if (status === 'success') {     
      phantom.addCookie({   //add name cookie1 with value = 1 
         name: 'cookie1', 
         value: '1', 
         domain: 'localhost' 
      }); 
      phantom.addCookie({   // add cookie2 with value 2 
         name: 'cookie2', 
         value: '2', 
         domain: 'localhost' 
      }); 
      phantom.addCookie({   // add cookie3 with value 3 
         name: 'cookie3', 
         value: '3', 
         domain: 'localhost' 
      }); 
      console.log('Added 3 cookies'); 
      console.log('Total cookies :'+phantom.cookies.length); 
      phantom.clearCookies(); 
      console.log(
         'After clearcookies method total cookies :' +phantom.cookies.length); 
      
      phantom.exit();     
   } else { 
      console.error('Cannot open file'); 
      phantom.exit(1); 
   } 
}); 

a.html

<html>
   <head>
      <title>Welcome to phantomjs test page</title>
   </head>
   
   <body>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
   </body>
</html>

上述程序生成以下输出

Added 3 cookies 
Total cookies :3 
After clearcookies method total cookies :0 

删除Cookie

删除CookieJar中“name”属性与 cookieName 匹配的所有 cookie 。如果删除成功,则返回true ;否则为

句法

其语法如下 -

phantom.deleteCookie(cookiename);

让我们通过一个例子来了解addcookie、clearcookiesdeletecookie 。

例子

这是一个演示 deleteCookie 方法使用的示例 -

文件:cookie.js

var page = require('webpage').create(),url = 'http://localhost/tasks/a.html'; 
page.open(url, function(status) { 
   if (status === 'success') {     
      phantom.addCookie({   //add name cookie1 with value = 1 
         name: 'cookie1', 
         value: '1', 
         domain: 'localhost' 
      }); 
      phantom.addCookie({   // add cookie2 with value 2 
         name: 'cookie2', 
         value: '2', 
         domain: 'localhost' 
      });
      phantom.addCookie({   // add cookie3 with value 3 
         name: 'cookie3', 
         value: '3', 
         domain: 'localhost' 
      });  
      console.log('Added 3 cookies'); 
      console.log('Total cookies :'+phantom.cookies.length); 
      
      //will output the total cookies added to the url.    
      console.log("Deleting cookie2"); 
      phantom.deleteCookie('cookie2'); 
      
      console.log('Total cookies :'+phantom.cookies.length); 
      phantom.clearCookies();
      
      console.log(
         'After clearcookies method total cookies :' +phantom.cookies.length); 
      phantom.exit(); 
   } else { 
      console.error('Cannot open file'); 
      phantom.exit(1); 
   } 
});

上述程序生成以下输出

phantomjs cookie.js
Added 3 cookies
Total cookies :3
Deleting cookie2
Total cookies :2
After clearcookies method total cookies :0

出口

phantom.exit 方法将退出它已启动的脚本。它退出程序并带有提到的返回值。如果没有传递任何值,它会给出'0' 。

句法

其语法如下 -

phantom.exit(value);

如果您不添加phantom.exit,则命令行假定执行仍在进行并且不会完成。

例子

让我们看一个例子来了解exit方法的使用。

console.log('Welcome to phantomJs');  // outputs Welcome to phantomJS 
var a = 1; 
if (a === 1) { 
   console.log('Exit 1'); //outputs Exit 1 
   phantom.exit(); // Code exits. 
} else { 
   console.log('Exit 2'); 
   phantom.exit(1); 
}

上述程序生成以下输出

phantomjs exit.js

Welcome to phantomJs 
Exit 1 

phantom.exit 之后的任何代码都不会被执行,因为 phantom.exit 是结束脚本的方法。

注入

InjectJs用于在phantom中添加addtionaljs文件。如果在当前目录 librarypath中找不到该文件,则将使用 phantom 属性 (phantom.libraryPath) 作为跟踪路径的附加位置。如果文件添加成功则返回true ,否则返回false,如果无法找到文件则失败。

句法

其语法如下 -

phantom.injectJs(filename);

例子

让我们看下面的例子来了解injectJs的使用。

文件名:inject.js

console.log(“Added file”); 

文件名:addfile.js

var addfile =  injectJs(inject.js);
console.log(addfile);
phantom.exit();

输出

命令- C:\phantomjs\bin>phantomjs addfile.js

Added file // coming from inject.js
true

在上面的示例中,addfile.js使用injectJs调用文件inject.js。当您执行 addfile.js 时,inject.js 中存在的 console.log 将显示在输出中。由于文件 insert.js 已成功添加,因此 addfile 变量也显示为 true。

PhantomJS - 网页模块属性

PhantomJS 提供了相当多的属性和方法来帮助我们与网页内的内容进行交互。

require("webpage").create() 命令创建一个网页对象。我们将使用该对象借助下面列出的属性和方法来操作网页。

var wpage = require("webpage").create();

下表列出了我们将要讨论的所有网页属性。

序列号 属性及说明
1 可以返回

如果导航历史记录中有上一页,则此属性返回true ;如果不是,则 false

2 可以前进

如果导航历史记录中有下一页,则此属性返回 true;如果不是,则 false

3 剪辑矩形

ClipRect 是一个具有 top、left、width 和 height 值的对象,用于在 render() 方法使用时捕获网页的图像。

4 内容

该属性包含网页的内容。

5 cookie

通过 cookie,您可以设置/获取 URL 上可用的 cookie。它还将为您提供 URL 上可用的 cookie 以及页面上设置的新 cookie。

6 自定义标题

customHeaders 指定额外的 HTTP 请求标头,这些标头将针对页面发出的每个请求发送到服务器。

7 事件

它提供了长长的事件列表,即修饰符、按键详细信息。

8 焦点框架名称

返回当前聚焦框架的名称。

9 框架内容

该属性给出了活动框架的内容。

10 框架名称

返回当前聚焦框架的名称。

11 框架纯文本

此属性还提供当前活动框架的内容,但仅限于没有任何 html 标签的内容。

12 框架标题

给出活动框架的标题。

13 框架网址

该属性将给出当前焦点框架的 url。

14 帧数

给出页面上存在的帧的计数。

15 帧名称

给出帧名称数组。

16 库路径

该属性具有由 page.inectJs 方法使用的路径。

17 号 导航锁定

该属性定义是否允许页面导航。如果为 true,它将位于当前页面 url 上,并且不允许单击页面进入下一页。

18 离线存储路径

此属性给出使用 window.localStorage 存储数据的路径。可以使用命令行中的 --local-storage-path 更改该路径。

19 离线存储配额

此属性定义了您可以在 window.localStorage 中存储的最大数据量。该值为 5242880 字节,即 5MB。可以使用以下命令在命令行覆盖该值 --localstorage-quota = size 。

20 拥有页面

如果网页打开的页面是该网页的子页面,ownsPages 将返回 true 或 false。

21 页面窗口名称

PagesWindowName 将给出使用 window.open 打开的窗口的名称

22 页面

Pages 属性将为您提供使用 window.open 在页面中打开的页面数组。如果页面在 url 中关闭,您引用的页面将不会被考虑。

23 纸张尺寸

该属性给出了需要用于将网页转换为pdf格式时的尺寸,即网页的尺寸。paperSize包含对象中所需的尺寸。

24 纯文本

此属性还提供当前活动框架的内容,但仅限于没有任何 html 标签的内容。

25 滚动位置

这包含指示滚动位置的对象。它给出了左侧和顶部。

26 设置

当使用 page.open 方法时,该属性将给出网页的设置。页面加载后,设置属性的更改不会产生任何影响。

27 标题

此属性将为您提供您正在阅读的页面的标题。

28 网址

该属性将给出页面 url。

29 视口大小

此属性允许更改窗口显示的大小。它包含宽度和高度,您可以根据需要读取或更改它。

30 窗口名称

给出窗口的名称。

31 缩放系数

此属性指定 render 和 renderBase64 方法的缩放系数。如果需要,它有助于缩放页面并截取屏幕截图。

PhantomJS - 网页模块方法

网页模块具有Cookie、框架、页面导航、重新加载、渲染上传文件的方法。

以下是网页上可用的方法。

序列号 方法与说明
1 添加Cookie()

addCookie 方法将cookie 添加到指定的页面。

2 childFramesCount()

根据http://phantomjs.org,此方法已被弃用。

3 子框架名称()

根据http://phantomjs.org,此方法已被弃用。

4 清除Cookies()

将删除指定页面的所有 cookie。

5 关闭()

该方法用于关闭页面并释放所使用的内存。一旦调用关闭,任何网页方法或属性都将不起作用。

6 当前帧名称()

根据http://phantomjs.org,此方法已被弃用。

7 删除Cookie()

这将删除一个 cookie,其名称与给定页面 URL 的现有 cookie 列表相匹配。

8 评估异步()

在页面内异步评估给定函数,而不会阻止当前执行。该函数有助于异步执行某些脚本。

9 评估Javascript()

EvaluateJavaScript 有助于执行作为字符串传递给它的函数。请注意,传递的字符串只能是一个函数。

10 评价()

Evaluate 将执行传递给它的函数。如果函数包含控制台消息,则它不会直接显示在终端中。要显示任何控制台消息,您需要使用 onConsoleMessage 幻像回调。

11 获取页面()

这将为您提供与 getpage 中传递的窗口名称相匹配的子页面。

12 回去()

如果导航未锁定,它会提供导航历史记录中的上一页。

13 前进()

如果导航未锁定,它会给出导航历史记录中的下一页。

14 去()

此方法允许您浏览页面。

15 includeJs()

Includejs在页面上执行外部JS文件,并在完成时执行回调函数。

16 注入Js()

InjectJs 将指定文件中的外部脚本包含到页面中。如果该文件在当前目录中不可用,则它使用libraryPath 对该文件进行额外搜索。如果文件被注入则返回 true,否则返回 false。

17 号 打开网址()

OpenUrl 打开一个网页。与PhantomJS的open方法类似。OpenUrl 还有一些额外的参数,分别是 httpConf、设置和回调函数。

18 打开()

Open 用于打开网页。

19 发布()

Release 将释放页面的内存堆使用量。调用release后不要使用页面实例方法。此方法类似于 close 方法,但不推荐使用它。而是使用 wpage.close()。

20 重新加载()

Reload用于重新加载当前使用的页面。

21 渲染Base64()

此方法获取屏幕捕获并将图像作为 base46 字符串给出。Renderbase64 支持 PNG、JPEG 和 JPG 等格式。目前还不支持gif。您可以使用clipRect属性来定义图像捕获的部分。

22 渲染缓冲区()

RenderBuffer将网页的捕获保存到图像缓冲区中,该图像缓冲区可以直接发送到服务器。支持的格式有 PNG、GIF 和 JPEG。

23 使成为()

渲染有助于获取图像缓冲区并按照指定的格式保存它。

24 发送事件()

它用于向网页发送事件。它们不是 dom 事件。这些事件中的每一个都会根据用户交互发送到网页。

25 设置内容()

setcontent 会将指定 url 的页面内容更改为指定的内容。

26 停止()

它有助于停止加载页面。

27 switchToChildFrame()

不推荐使用 switchToFrame();

28 switchToFocusedFrame()

它选择焦点所在的框架。

29 switchToFrame()

选择具有指定名称且是当前帧的子帧的帧。

30 switchToMainFrame()

选择主机,即根窗口。

31 switchToParentFrame()

它采用当前子框架的父框架。

32 上传文件()

此方法用于处理使用 html 中的表单完成的文件上传。PhantomJS 没有直接的方法可以使用表单来实现,同样可以使用 uploadFile 方法来实现。它使用 html 标签选择器来确定文件位置和复制的目的地。

网页模块事件/回调

下表描述了网页模块可用的回调。

序列号 回调和描述
1 onAlert()

当页面有提醒时调用该回调;回调接受一个字符串并且不返回任何内容。

2 onCallback()

OnCallback 用于将值从网页传递到网页对象,这是使用 window.callPhantom() 方法完成的,该方法在内部调用 onCallback 函数。

3 onClosing()

当使用 page.close() 方法或 window.close() 方法关闭窗口时,将调用此函数。

4 onConfirm()

当页面中存在通过 ok /cancel 调用的确认消息时,将调用此回调。

5 onConsoleMessage()

当网页中使用控制台消息时使用此回调。onConsoleMessage 方法有 3 个参数。

6 onError()

当 JavaScript 错误时调用它。onError 的参数是 msg 和堆栈跟踪,它是一个数组。

7 onFilePicker()

这用于上传文件,当用户想要上传文件时调用回调。

8 onInitialized()

当页面在加载之前调用时,会调用此回调。

9 onLoadFinished()

当打开的页面完全加载时调用此函数。它有一个参数,用于指示加载何时成功或失败。

10 onLoadStarted()

当页面开始加载时会调用此回调。

11 onNavigationRequested()

此回调告知导航事件何时发生。

12 onPageCreated()

当页面打开新的子窗口时,将调用此回调。

13 onPrompt()

当网页调用提示时会调用此回调。它需要 2 个参数:消息和答案。返回值是一个字符串。

14 onResourceError()

当网页无法上传文件时调用此回调。

15 onResourceReceived()

当接收到页面请求的资源时,会调用此回调。

16 onResourceRequested()

当页面请求资源时调用此函数。

17 号 onResourceTimeout()

当使用 settings.resourceTimeout 时,当请求的资源超时时,会调用此回调。

18 onUrlChanged()

当使用导航改变当前 URL 时,会调用此函数。它有一个回调参数,这是一个新的 URL targetUrl 字符串。

网页子进程模块

Phantomjs 子进程模块有助于与子进程交互并使用stdin /stdout/stderr与它们对话。子进程可用于打印、发送邮件调用用另一种语言编写的程序等任务。要创建子进程模块,您需要引用。

例如 -

var process = require("child_process");

生成方法

通过spawn子进程,您可以订阅其stdoutstderr流以实时获取数据。

句法

其语法如下 -

var spawn = require('child_process').spawn;

例子

让我们看一个spawn方法的例子。

var process = require("child_process")
var spawn = process.spawn
var child = spawn("cmd", ['/c', 'dir']);

child.stdout.on("data", function (data) {
   console.log("spawnSTDOUT---VALUE:", JSON.stringify(data))
})
child.stderr.on("data", function (data) {
   console.log("spawnSTDERR:", JSON.stringify(data))
})
child.on("exit", function (code) {
   console.log("spawnEXIT:", code)
})

输出

上述程序生成以下输出。

spawnSTDOUT---VALUE: " Volume in drive C is OS\r\n"
spawnSTDOUT---VALUE: " Volume Serial Number is 7682-9C1B\r\n\r\n Directory of C:
\\phantomjs\\bin\r\n\r\n"
spawnSTDOUT---VALUE: "20-05-2017  10:01
<DIR>          .\r\n20-05-2017  10:01
<DIR>          ..\r\n13-05-2017  20:48   12 a,txt.txt\r\n07-05-2017  08:51
63 a.js\r\n06-05-2017  16:32           120,232 a.pdf\r\n13-05-2017  20:49 
spawnEXIT: 0 

PhantomJS - 文件系统模块属性

文件系统模块有许多 API 来处理文件和目录。您可以创建/写入和删除文件/目录。要开始使用文件系统模块,您必须需要对fs 模块的引用。

var fs = require('fs');

文件系统模块有两个可用属性:分隔符工作目录。让我们详细了解它们。

分隔器

它告诉您用于文件路径的分隔符。

  • 对于 Windows:\
  • 对于 Linux:/

句法

其语法如下 -

fs.seperator

例子

var fs = require('fs');
console.log(fs.seperator);
phantom.exit();

上述程序生成以下输出

undefined

工作目录

工作目录是 PhantomJS 执行的目录。

句法

其语法如下 -

var fs = require('fs');
fs.workingDirectory;

例子

var fs = require('fs');
console.log(fs.workingDirectory);
phantom.exit();

上述程序生成以下输出

C:/phantomjs/bin

PhantomJS - 文件系统模块方法

下表包含文件系统模块上可用的所有方法及其说明。

序列号 方法与说明
1 绝对

该方法给出了 PhantomJS 运行的绝对路径。

2 改变工作目录

这允许您更改工作目录并返回 true,如果成功则返回 false。

3 复制树

copyTree 会将目录从一个路径复制到另一个路径。第一个参数是源文件夹,第二个参数是目标文件夹。

4 复制

此方法有助于将文件从一个位置复制到另一个位置。它需要两个参数。第一个参数是源文件,第二个参数是要复制的文件路径。如果源文件或目标文件不存在,它将抛出错误。

5 存在

它检查系统中是否存在给定的文件路径。如果存在则返回 true,否则返回 false。

6 是绝对的

如果文件路径是绝对路径,则此方法将返回 true;如果是相对路径,则此方法将返回 false。

7 是目录

isDirectory 告诉给定的文件是否是目录。如果是目录,则返回 true,否则返回 false。如果给定路径不存在,则返回 false。

8 是可执行文件

此方法将判断给定文件是否可执行。如果可执行,则返回 true,否则返回 false。

9 是文件

这给出了给定的文件路径是否是文件的详细信息。如果它是一个文件,则返回 true;如果不是,则返回 false。

10 是链接

如果文件路径是符号链接,则返回 true,否则返回 false。

11 可读

它检查给定文件是否可读。如果是,则给出 true;如果否,则给出 false。

12 是可写的

它告诉给定的文件是否可写。如果是则返回 true,否则返回 false。

13 上一次更改

提供对文件进行的最后修改的详细信息。它告诉文件最后修改的日期和时间。

14 列表

它给出了目录中存在的所有文件。

15 建立目录

创建一个新目录。

16 生成树

makeTree 创建所有必要的文件夹以便能够形成最终目录。如果创建成功,则返回 true,否则返回 false。如果目录已经存在,则返回true。

17 号 移动

它将把文件从一个路径移动到另一路径。

18 打开

它用于打开文件。

19 读链接

这将返回符号链接(或 Windows 上的快捷方式)指向的文件或文件夹的绝对路径。如果路径不是符号链接或快捷方式,它将返回空字符串。

20

这将读取给定的文件。

21 删除目录

这将删除给定的目录。

22 删除树

它将删除给定文件夹中的所有文件和文件夹,最后删除文件夹本身。如果执行此过程时出现任何错误,它将抛出错误 -“无法删除目录树 PATH”并挂起执行。

23 消除

它删除给定的文件。

24 尺寸

它给出了文件的大小。

25 触碰

它创建一个给定的文件。

26

写入给定文件。

PhantomJS - 系统模块属性

在本章中,我们将讨论 PhantomJS 的各种系统模块属性。

参数

PhantomJS 的系统模块具有不同的属性,这些属性有助于传递参数、了解正在执行的文件等。

args 属性基本上返回在命令行传递的参数。您还可以传递您想要读取的页面 URL。如果要存储屏幕截图 pdf 文件或上传文件,可以将详细信息传递到命令行,并可以使用args属性读取。

让我们找到长度以及获取传递到命令行的每个参数的方法。

句法

其语法如下 -

var system = require('system'); 
system.args;

例子

请查看以下示例以了解此属性的工作原理。

var system = require('system');
console.log(system.args.length);

if (system.args.length>0) {
   console.log(JSON.stringify(system.args));
}
phantom.exit();

上述程序生成以下输出

命令- phantomsjs args.js http://localhost/tasks/request.html

2
["args.js","http://localhost/tasks/request.html"]

第一个值是文件名,下一个值是传递的 URL。您可以在命令行中传递更多参数并使用system.args获取相同的参数。

环境

env属性返回系统的详细信息。

句法

其语法如下 -

var system = require('system'); 
system.env;

例子

var system = require('system'); 
console.log(JSON.stringify(system.env)); 
phantom.exit();

上述程序生成以下输出。

{"=::":"::\\","=C:":"C:\\phantomjs\\bin","=ExitCode":"00000000","ALLUSERSPROFILE":
"C:\\ProgramData","APPDATA":"C:\\Users\\UserName\\AppData\\Roaming","COMPUTERNAME":
"X","ComSpec":"C:\\Windows\\system32\\cmd.exe","CommonProgramFiles":
"C:\\Program Files (x86)\\Common Files","CommonProgramFiles(x86)":
"C:\\Program Files (x86)\\Common Files","CommonProgramW6432":
"C:\\Program Files\\Common Files","FP_NO_HOST_CHECK":"NO","HOMEDRIVE":"C:",
"HOMEPATH":"\\Users\\UserName","LOCALAPPDATA":
"C:\\Users\\UserName\\AppData\\Local","LOGONSERVER":"\\\\MicrosoftAccount",
"NUMBER_OF_PROCESSORS":"2","OS":"Windows_NT","PATHEXT":".COM;.EXE;.BAT;.CMD;.VBS ;
.VBE;.JS;.JSE;.WSF;.WSH;.MSC","PROCESSOR_ARCHITECTURE":"x86","PROCESSOR_ARCHITEW64 32":
"AMD64","PROCESSOR_IDENTIFIER":"Intel64 Family 6 Model 58Stepping9,GenuineIntel",
"PROCESSOR_LEVEL":"6","PROCESSOR_REVISION":"3a09","PROMPT":
"$P$G","PSModulePath":"C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\
Modules\\" ,"PUBLIC":"C:\\Users\\Public","Path":
"C:\\Program Files\\Dell\\DW WLAN Card;
c:\\Program Files (x86)\\Intel\\iCLS Client\\;c:\\Program Files\\Intel\\iCLSClient\\;
C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\ \Wbem;
C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;
C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;
C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;
C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;
C:\\Program Files (x86)\\Intel\\Intel(R) 
ManagementEngineComponents\\IPT;c:\\ProgramFiles\\WIDCOMM\\BluetoothSoftware\\;
c:\\ProgramFiles\\WIDCOMM\\BluetoothSoftware\\syswow64;
C:\\ProgramFiles(x86)\\WindowsLive\\Shared;C:\\ProgramFiles\\nodejs\\;
C:\\ProgramFiles\\Git\\cmd;C:\\ProgramFiles\\ OpenVPN\\bin;
C:\\ProgramFiles(x86)\\Skype\\Phone\\;C:\\Users\\UserName\\AppData\\Roaming
\\npm","ProgramData":
"C:\\ProgramData","ProgramFiles":"C:\\ProgramFiles(x86)", 
"ProgramFiles(x86)":"C:\\ProgramFiles(x86)","ProgramW6432":
"C:\\ProgramFiles","SESSIONNAME":"Console","SystemDrive":
"C:","SystemRoot":"C:\\Windows","TEMP":"C:\\Users\ \Username~1\\AppData\\Local\\Temp",
"TMP":"C:\\Users\\Username~1\\AppData\\Local\\Temp",
"USERDOMAIN":"USER","USERDOMAIN_ROAMINGPROFILE":"USER","USERNAME":"X Y","USERPROFILE":
"C:\\Users\\X Y","windir":"C:\\Windows"}

操作系统

它返回所使用的操作系统的详细信息。它返回一个包含体系结构、操作系统名称和版本的对象。

句法

其语法如下 -

var system = require('system');
system.os;

例子

var system = require('system');
console.log(JSON.stringify(system.os));
phantom.exit();

上述程序生成以下输出。

{"architecture":"32bit","name":"windows","version":"8.1"}

PID

该属性返回进程 ID。

句法

其语法如下 -

var system = require('system');
system.pid;

例子

让我们看一下pid属性的示例。

var system = require('system');
console.log(system.pid);
phantom.exit();

上述程序生成以下输出。

2160

平台

该属性返回我们正在使用的平台。

句法

其语法如下 -

var system = require('system');
system.platform;

例子

var system = require('system');
console.log(system.platform);
phantom.exit();

上述程序生成以下输出。

Phantomjs

PhantomJS - Web 服务器模块属性

PhantomJS 使用名为mongoose的嵌入式 Web 服务器。目前,PhantomJS 无法与任何其他生产网络服务器连接。对于连接来说,它一次可以处理10个连接,超过10个请求就会在队列中等待。

要启动网络服务器,我们需要使用以下语法 -

var webserver = require (‘webserver’);

让我们了解一下Port属性,它用于监听发送到 Web 服务器的请求。

港口

Web 服务器的 Port 属性用于侦听发送给它的请求。

句法

其语法如下 -

var server = require('webserver').create();
var listening = server.listen(port, function (request, response) {});

例子

让我们举个例子来了解端口属性是如何工作的。

var webserver = require('webserver'); 
var server = webserver.create(); 
var service = server.listen(8080,function(request,response){  
}); 
if(service) console.log("server started - http://localhost:" + server.port); 

上述程序生成以下输出。

server started - http://localhost:8080

PhantomJS - Web 服务器模块方法

在本章中,我们将讨论 PhantomJS Web 服务器模块的各种方法。

关闭

close方法用于关闭网络服务器。

句法

其语法如下 -

var server = require('webserver').create();
server.close();

例子

以下示例展示了如何使用close方法。

var webserver = require('webserver');
var server = webserver.create();
var service = server.listen(8080,function(request,response){
});

if(service) console.log("server started - http://localhost:" + server.port);
console.log(server.port);
server.close();
console.log(server.port);

上述程序生成以下输出

server started - http://localhost:8080 
8080

在这里,我们在关闭服务器后对server.port进行了控制台操作。因此,它不会响应,因为网络服务器已经关闭。

server.listen方法采用带有两个参数的端口和回调函数,即请求对象响应对象

请求对象包含以下属性 -

  • 方法- 这定义了方法 GET /POST。

  • URL - 显示请求的 URL。

  • httpVersion - 显示实际的 http 版本。

  • headers - 这显示所有带有键值对的标题。

  • Post - 请求正文仅适用于 post 方法。

  • postRaw - 如果 Content-Type 标头设置为“application/x-www-formurlencoded”,则帖子的原始内容将存储在这个额外的属性(postRaw)中,然后该帖子将使用 URL 解码自动更新数据的版本。

响应对象包含以下属性 -

  • headers - 将所有 HTTP 标头作为键值对。应在第一次调用 write 之前设置。

  • SetHeader - 这设置一个特定的标头。

  • 标头(名称) - 它返回给定标头的值。

  • StatusCode - 它设置返回的 HTTP 状态代码。

  • SetEncoding (encoding) - 用于转换给 write() 的数据。默认情况下,数据将转换为 UTF-8。如果数据是二进制字符串,则指示“二进制”。如果数据是缓冲区(例如来自 page.renderBuffer),则不需要。

  • Write (data) - 它发送响应主体的数据。可以多次调用。

  • WriteHead (statusCode, headers) - 它向请求发送响应标头。状态代码是 3 位 HTTP 状态代码(例如 404)。最后的参数和标头是响应标头。

  • Close - 它关闭 http 连接。

  • CloseGraceously - 它与 close() 类似,但它确保首先发送响应标头。

句法

其语法如下 -

var server = require('webserver').create(); 
var listening = server.listen(8080, function (request, response) {} 

例子

让我们通过一个例子来了解listen方法是如何工作的。

var page = require('webpage').create(); 
var server = require('webserver').create(); 
var port = 8080; 
var listening = server.listen(8080, function (request, response) { 
   console.log("GOT HTTP REQUEST"); 
   console.log(JSON.stringify(request, null, 4)); 
   
   // we set the headers here 
   response.statusCode = 200; 
   response.headers = {"Cache": "no-cache", "Content-Type": "text/html"};  
 
   // the headers above will now be sent implictly 
   // now we write the body 
   response.write("<html><head><title>Welcone to Phantomjs</title></head>"); 
   response.write("<body><p>Hello World</p></body></html>"); 
   response.close(); 
}); 

if (!listening) { 
   console.log("could not create web server listening on port " + port); 
   phantom.exit(); 
} 

var url = "http://localhost:" + port + "/foo/response.php"; 
console.log("sending request to :" +url); 
page.open(url, function (status) { 
   if (status !== 'success') { 
      console.log('page not opening'); 
   } else { 
      console.log("Getting response from the server:"); 
      console.log(page.content); 
   } 
   
   phantom.exit(); 
});

上述程序生成以下输出

sending request to :http://localhost:8080/foo/response.php 
GOT HTTP REQUEST { 
   "headers": {
      "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
      "Accept-Encoding": "gzip, deflate", 
      "Accept-Language": "en-IN,*", 
      "Connection": "Keep-Alive", 
      "Host": "localhost:8080", 
      "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/538.1 
         (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1" 
   }, 
   "httpVersion": "1.1", 
   "method": "GET", 
   "url": "/foo/response.php" 
} 
Getting response from the server: 
<html><head><title>Welcone to Phantomjs</title></head><body><p>Hello World</p></body>
</html> 

PhantomJS - 命令行界面

PhantomJS 可以使用关键字“phantomjs”和文件名来执行。例如,“phantomjs file.js”。

您还可以将参数传递到“file.js”中,如下所示 -

phantomjs [options] file.js arg1 arg2 ...

让我们看一下命令行上可用的一些选项。

序列号 选项和说明
1

--帮助或-h

将显示所有命令行选项。立即停止并且不会运行通过的脚本。

2

--版本或-v

打印 PhantomJS 运行的版本。这将停止要运行的脚本的执行。

3

--调试[真|假]

打印警告和调试消息。默认情况下,它设置为 false。您也可以使用[是|否]。

4

--cookies-file = /path/to/cookies.txt

存储持久 cookie 的文件名。

5

--diskcache=[真|假]

启用磁盘缓存。它还需要值 [yes|no]

6

--磁盘缓存路径

磁盘缓存的路径。

7

--ignore-sslerrors=[真|假]

忽略 SSL 错误。例如 – 过期或自签名证书错误。默认为 false。它还采用值 [yes|no]。

8

--loadimages=[真|假]

加载所有内联图像。默认值为 true。它还需要[是|否]。

9

--local-storagepath=/一些/路径

LocalStorage内容和WebSQL内容的保存路径。

10

--local-storagequota=数量

允许数据的最大大小。

11

--本地 url 访问

允许使用“file:///”URL(默认值为 true)。

12

--local-to-remote-urlaccess=[true|false]

允许本地内容访问远程 URL。默认为 false。它还采用值 [yes|no]。

13

--max-disk-cachesize=大小

限制磁盘缓存的大小(以 KB 为单位)

14

--离线存储路径

指定离线存储的位置。

15

--离线存储配额

设置离线的最大尺寸