资源说明:a lightweight proxy that lets you to drive phantomjs from node.
#### Subscribing to events
```javascript
phantomProxy = require('phantom-proxy');
phantomProxy.create({}, function (proxy) {
proxy.page.on('urlChanged', function(){
console.log('url changed');
});
});
```
#### Special events
Some phantomjs functions allow you to return a value to drive phantom interaction. Currently, onConfirm is supported. To register a callback function for intercepting confirm dialogs, use onConfirmCallback:
```javascript
// return true corresponds to accepting confirm, return false is denying
proxy.page.set('onConfirmCallback', function(msg) { return true; });
```
Pre-registering a confirm function can be useful if you encounter a page that prompts you when you try to leave. Without registering a function that returns true, phantomjs will hang. Please note you can still listen for the 'confirm' event in conjunction with this special handler.
## Revision History
* 2012-11-06 - version 0.1.6
- reworked event communication interface to use socket.io - no longer using filesyste to pass event messages, should help with dropped msgs
* 2012-11-06 - version 0.1.6
- reworked event communication interface - no longer using stdoutput to pass event messages
- reworked process creation and exit logic
- startup time and event latency are much improved - should run much faster than before
* 2012-11-03 - version 0.1.3
- added callback parameter to end method on proxy.
- removed unref call in proxy
- added debug option
* 2012-10-22 - version 0.1.2
- breaking - changed the way events are consumed, switched to using nodes emmitter to brodcast events as opposed to invoking instance methods on the object. To fix issues, use [object].on('eventname') style syntax.
- Code clean up
* 2012-10-17 - version 0.1.16
- fixed waitforSelector issue
* 2012-10-12 - version 0.1.15
- fixed a problem w/ waitforSelector fn.
- fixed problem where process wasn't shutting down existing server.
* version 0.1.13
- added args property handling for phantom object
- added ability to specify port for rpc channel
- added timeout on waitforSelector function
- added ability to pass cmd line arguments for phantom via options object
* version 0.1.10
- cleaned up and reorganized code
- added unit tests
- fixed process related issues
# phantom-proxy
* Allows you to drive [phantomjs](http://www.phantomjs.org) from [node](http://www.nodejs.org)
* Does not rely on alert side effects for communicating with phantomjs
* Uses Phantom's embedded mongoose web server for communication - more efficient, simpler, faster.
* Provides a full api - including a parametrized evaluate function - no more hard coded strings
* Provides additional useful methods such as waitForSelector
* Can easily integrate with feature testing frameworks such as [cucumber](https://github.com/cucumber/cucumber-js), jasmine, mocha
## Overview
PhantomJs is an incredibly useful tool for functional and unit testing. PhantomJs runs in its own process, making it difficult to drive from node. Phantom-proxy solves this problem, allowing you to fully drive phantomjs from node.
## Installation
`npm install phantom-proxy`
## Usage
### Examples
See the [API](https://github.com/sheebz/phantom-proxy/blob/master/api.md) documentation for more usage information.
#### wait for a specific selector to appear
```javascript
var phantomProxy = require('phantom-proxy');
phantomProxy.create({}, function (proxy) {
var page = proxy.page;
page.open('http://www.w3.org', function () {
page.waitForSelector('body', function () {
console.log('body tag present');
proxy.end(function () {
console.log('done');
});
});
});
});
```
#### render a screenshot
```javascript
var phantomProxy = require('phantom-proxy');
phantomProxy.create({'debug': true}, function (proxy) {
proxy.page.open('http://www.w3.org', function (result) {
assert.equal(result, true);
proxy.page.waitForSelector('body', function (result) {
assert.equal(result, true);
proxy.page.render('./scratch/scratch.png', function (result) {
assert.equal(result, true);
proxy.end(function () {
console.log('done');
});
});
}, 1000);
});
});
```
#### subscribe to events - see api docs for complete list
```javascript
var phantomProxy = require('phantom-proxy');
phantomProxy.create({'debug': true}, function (proxy) {
this.proxy.page.on('navigationRequested', function (url) {
console.log('at %s', url);
if (url === 'http://www.w3.org') {
console.log('at w3.org');
}
else {
console.log('how did we get here?');
}
proxy.end(function () {
console.log('done');
});
});
proxy.page.open('http://www.w3.org', function (result) {
proxy.page.on('alert', function (msg) {
if (msg.trim() === 'hello') {
console.log('it said hello');
}
proxy.end(function () {
console.log('done');
});
});
});
});
```
# API Documentation
## phantomProxy object
### create([options], callbackFn)
use this method to create an instance of the phantom proxy objects. The return value will be an object with a page proxy and a phantom proxy. These properties correspond to the phantom and webpage objects on the native phantom API.
When this method is called, a new phantomjs process is spawned. The new phantomjs process creates a mongoose webserver on localhost:1061. All subsequent communication with phantom occurs via http requests.
#### Options argument (experimental)
Create accepts an options object as the first parameter. This argument is optional. Properties and their default values are listed below.
```javascript
var defaultoptions = {
'ignoreSslErrors':true,
'localToRemoteUrlAccessEnabled':true,
'cookiesFile':'cookies.txt',
'diskCache':'yes',
'loadImages':'yes',
'localToRemoteUrlAccess':'no',
'maxDiskCache':'50000',
'outputEncoding':'utf8',
'proxy':'0',
'proxyType':'yes',
'scriptEncoding':'yes',
'webSecurity':'yes',
'port':1061
};
```
### end(callbackFn)
You should call end on the returned proxy object to ensure that phantomjs is properly shut down.
```javascript
var phantomProxy = require('phantom-proxy').create(function(proxy){
var page = proxy.page,
phantom = proxy.phantom;
//do some stuff...
//...
//call end when done
proxy.end(function(){
console.log('phantom has exited');
});
});
```
## phantom Object
The phantom object corresponds to the phantom object in the native phantomJs API.
## Page Object
The page object corresponds to the webpage object in the native phantomJs API.
### set(propertyName, propertyValue, callbackFn)
sets setting on page object
```javascript
proxy.page.set('userAgent', 'iPad', function (result) {
console.log(result.toString());
});
```
### get(propertyName, callbackFn)
gets a setting on page object
```javascript
proxy.page.get('userAgent', function (result) {
console.log(result.toString());
});
```
### open(url, callbackFn)
Opens a webpage with url and callback function arguments.
```javascript
var phantomProxy = require('phantom-proxy').create({}, function(proxy){
var page = proxy.page,
phantom = proxy.phantom;
page.open('http://www.w3.org', function(){
console.log('page now open');
//close proxy
phantomProxy.end();
});
});
```
### waitForSelector(selector, callbackFn, timeout)
Polls page for presence of selector, executes callback when selector is present.
```javascript
var phantomProxy = require('phantom-proxy').create({}, function(proxy){
var page = proxy.page,
phantom = proxy.phantom;
page.open('http://www.w3.org', function(){
page.waitForSelector('body', function(){
console.log('body tag present');
//close proxy
phantomProxy.end();
});
console.log('page now open');
});
});
```
### render(fileName, callbackFn)
Renders a image of browser.
```javascript
var phantomProxy = require('phantom-proxy').create({}, function(proxy){
var page = proxy.page,
phantom = proxy.phantom;
page.open('http://www.w3.org', function(){
page.waitForSelector('body', function(){
console.log('body tag present');
page.render('myimage.png', function(){
console.log('saved my picture!');
//close proxy
phantomProxy.end();
});
});
console.log('page now open');
});
});
```
### renderBase64(type, callbackFn)
Returns a base64 representation of image.
### evaluate(functionToEvaluate, callbackFn, [arg1, arg2,... argN]
Executes functionToEvaluate in phantomJS browser. Once function executes, callbackFn will be invoked with a result parameter. The Third and sebsequent arguments represent optional parameters which will be passed to the functionToEvaluate function when it is invoked in the browser.
## Events
The following events are supported, see [PhantomJs Docs](https://github.com/ariya/phantomjs/wiki/API-Reference) for more information.
| Event Name | Notes |
|---|---|
| urlChanged | |
| resourceReceived | |
| resourceRequested | |
| prompt | Event will fire, but callback will not execute in phantomjs context |
| pageCreated | |
| navigationRequested | |
| loadStarted | |
| loadFinished | |
| initialized | |
| error | |
| consoleMessage | |
| confirm | See onConfirmCallback for handling this event |
| closing | |
| callback | |
| alert |
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。
English
