发布于 2015-08-25 19:55:55 | 780 次阅读 | 评论: 0 | 来源: PHPERZ

web page 模块

web page模块的功能是处理具体的页面。使用时需要引入模块,并创建实例:

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

本文中不经说明, page指代 require("webpage").create()的实例。

  1. page.cookies Object[]
    与上文中的 phantom.cookies类似,表示本url下的cookie的读取。同样类似的API还有 addCookie()、 deleteCookie()、 clearCookies()。
  2. 页面内容相关的API
    • page.content String:获取或设置当前页面的html。
    • page.plainText String:这是一个只读属性,获取页面去除html标记的文本(考虑 $.text())。
    • page.url String:只读,获取当前页面的url。
    • page.setContent():允许修改 page.content和 page.url内容,会触发reload。
  3. page.settings Object
    对于当前页面的一些配置项。此API必须在 page.open()调用之前设置,否则不会起作用。以下是配置项:
    * javascriptEnabled 默认 true:是否执行页面内的javascript
    • loadImages 默认 true:是否载入图片
    • userAgent :传递给服务器的userAgent字符串
    • userName :用于http访问授权的用户名
    • password :用于http访问授权的密码
    • XSSAuditingEnabled 默认 false:是否监控跨域请求
    • resourceTimeout 单位 ms:定义资源请求的超时时间。如果设置了此项,则页面中如果有任何资源超过此时限未请求成功,则页面其他部分也会停止请求,并触发 onResourceTimeout()事件处理。
  4. page.customHeaders Object
    phantom允许在请求时在http请求头部添加额外信息,此设置项对这个page里面所有的请求都生效(包含页面和其他资源的请求)。添加的信息并没有限制,但如果设置 User-Agent的值,那么这个值会覆盖掉 page.settings里的设置值。示例:
    page.customHeaders = {
        "X-Test": "foo",
        "DNT": "1"
    };
  5. page.libraryPath String
    与 phantom.libraryPath类似,page对象也支持设置js文件路径,同时可以通过相应的 page.injectJs()方法注入javascript文件。除了 page.injectJs()方法外,还有 page.includeJs()也可以加入javascript文件。它们的区别在于, page.injectJs()不强求此文件能访问得到,即使是一个不可访问的资源也可以。
  6. page.navigationLocked Boolean 默认 fasle
    设置是否允许离开当前页面,默认是允许。
  7. page.open()
    此方法用于打开一个网页,是一个很重要的API,它有三种调用形式:< >open(url, callback)open(url, method, callback)open(url, method, data, callback)$.ajax(),可以更好理解这个API。对于这些参数,需要单独阐述的是 callback。 callback()会在页面载入完成后调用,由 page.onLoadFinished调用(时机晚于 page.onLoadFinished)。这个 callback会接受一个参数 status,可能值为 "success"和 "fail",指示页面是否加载成功。示例可以参考“简单示例”一节的例子。
  8. page.close()
    与 page.open()对应,调用 page.close()之后,会释放page所占用的内存,我们不可以在此之后再调用page实例。在实际的操作中,调用此方法并不会完成清空所占内存;javascript的垃圾回收机制也不会回收page实例。但在实际使用中,常常会遇到将一个page实例反复open的情况。在一个页面用完后,记得一定要执行 page.close(),这样在下一次open的时候,才不会重复分配堆栈空间。
  9. page.evaluate(fn, [param])
    对于page打开的页面,往往需要与其进行一些交互。 page.evaluate()提供了在page打开页面的上下文(下文直接用page上下文指代)执行function的功能(类比Chrome开发者工具的控制台)。如下例:
    page.open('http://m.bing.com', function(status) {
        var title = page.evaluate(function(s) {
            return document.querySelector(s).innerText;
        }, 'title');
        console.log(title);
        phantom.exit();
    });

    在 这个例子中, page.evaluate()接受两个参数,第一个是必需的,表示需要在page上下文运行的函数 fn;第二个是可选的,表示需要传给 fn的参数 param。 fn允许有一个返回值 return,并且此返回值最终作为 page.evaluate()的返回值。这边对于刚刚命名的 param和 return有一些额外的说明和注意事项。对于整个phantom进程而言, page.evaluate()是跑在一个沙盒中, fn无法访问一切phantom域中的变量;同样 page.evaluate()方法外部也不应该尝试访问page上下文中的内容。那么如果两个作用域需要交换一些数据,只能依靠 param和 return。不过限制很大, param和 return必须为能够转化为JSON字符串,换言之,只能是基本数据类型或者简单对象,像DOM 节点、$对象、function、闭包等就无能为力了。
    这个方法是同步的,如果执行的内容对后续操作不具备前置性,可以尝试异步方法以提高性能: page.evaluateAsync()。

  10. page.render(filename)
    page.render()能够把当前页面渲染成图片并输出到指定文件中。输出的文件格式由传入的文件扩展名决定,目前支持 PNG、 JPEG、 GIF、 PDF。
    var page = require('webpage').create();
    page.open('http://github.com/', function() {
        page.render('github.png');
        phantom.exit();
    });

    还有其他一些API会对 page.render()产生影响,如:

    page.zoomFactor Number: 设置缩放比率page.clipRect Object:设置输出的矩形区域,例如:
    page.clipRect = {
        top: 14,
        left: 3,
        width: 400,
        height: 300
    };

    page.renderBase64(),也不再详述。

  11. page.sendEvent()
    为了交互的需要(测试的需要),phantom允许通过代码模拟一些交互事件(注意与DOM事件的区分)。
    1. 鼠标事件:
      API: sendEvent(mouseEventType[, mouseX, mouseY, button='left'])
      mouseEventtype可能的取值为: 'mouseup'、 'mousedown'、 'mousemove'、 'doubleclick'和 'click',这个参数为必须的。
      后两个参数为鼠标事件的坐标位置。最后一个参数为鼠标按键,只对需要按键的事件有效,默认为 'left',可能值为 'right'、 'left'、 'middle'。
    2. 键盘事件:
      API: sendEvent(keyboardEventType, keyOrKeys, [null, null, modifier])
      keyboardEventType可能的取值为 'keyup'、 'keydown'、 'keypress',第2个参数传入一个键值或一个字符串。键值可以通过 page.event.key来查询调用。第三和第四个参数无效,第五个参数表示同时按下的修饰键。取值情况如下:
      0: 未使用修饰键
      0x02000000: Shift键被按下
      0x04000000: Ctrl键被按下
      0x08000000: Alt键被按下
      page.sendEvent('keypress', page.event.key.A, null, null, 0x02000000 | 0x08000000);
  12. page.switchToFrame(frameName/framePosition)
    默 认page对应的是frame,如果一个页面中还有其他frame,则可以通过此方法切换page对应的frame。其他类似的方法还有 switchToChildFrame()、 switchToParentFrame()、 switchToFocusedFrame()、 switchToMainFrame()等,不再赘述。
  13. page.uploadFile(selector, file)
    页面中常常会有上传文件的操作,但phantom没有界面,因而也就没有办法选择文件上传,通过此方法可以模拟文件上传操作。示例如下:
    page.uploadFile('input[name=image]', '/path/to/some/photo.jpg');
  14. 一些事件处理接口
  • page.onAlert:phantom没有界面,所以也就不能处理alert窗口,但可以通过此接口捕获到alert。
  • page.onPrompt:类似的,phantom不能处理prompt窗口,通过这个接口可以捕获prompt。
  • page.onConfirm:类似的,phantom不能处理confirm窗口,通过这个接口可以捕获confirm。
  • page.onConsoleMessage:类似的,phantom不能显示console窗口,通过这个接口可以捕获console消息。
    var webPage = require('webpage');
    var page = webPage.create();
    page.onAlert = function(msg) {
        console.log('ALERT: ' + msg);
    };
    page.onPrompt = function(msg, defaultVal) {
        if (msg === "What's your name?") {
            return 'PhantomJS';
        }
        // 返回值就是prompt得到的值
        return defaultVal;
    };
    page.onConfirm = function(msg) {
        console.log('CONFIRM: ' + msg);
        // 返回true相当于点击“确定”,返回false相当于点击“取消”
        return true;
    };
    page.onConsoleMessage = function(msg, lineNum, sourceId) {
        console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
    };
  • page.onInitialized:在page创建后触发。

  • page.onUrlChanged:在url发生变化时触发。它接受新的url作为参数。首次加载页面, page.onUrlChanged是在 page.onInitialized之后触发。

  • page.onNavigationRequested:如果在 page.navigationLocked中允许页面跳转,此接口才会有意义(参见 page.navigationLocked)。它接受4个参数,先看示例:

    page.onNavigationRequested = function(url, type, willNavigate, main) {
          console.log('Trying to navigate to: ' + url);
          console.log('Caused by: ' + type);
          console.log('Will actually navigate: ' + willNavigate);
          console.log('Sent from the page\'s main frame: ' + main);
    }

    url表示要跳转到的url

    type表示产生跳转的原因,可能值有 'Undefined'、 'LinkClicked'、 'FormSubmitted'、 'BackOrForward'、 'Reload'、 'FormResubmitted'、 'Other'

    willNavigate表示是否会跳转,由 page.navigationLocked控制

    main表示发生跳转的是否是主frame,如果是主frame则为true,如果为其他frame则为false

  • page.onLoadStarted:在开始载入资源时触发。

  • page.onLoadFinished:页面所有资源载入完成后触发。其实与 page.open()的回调函数等价。它接受一个参数 status,表示加载是否成功。参见 page.open()。

  • page.onClosing:当在phantom域调用 page.close()或page上下文调用 window.close()时触发。

  • page.onError: 此接口捕获所有page上下文发生的javascript错误。参数是错误信息和调用堆栈,参见 phantom.onError。如果page不处理错误,那么这些错误会冒泡到phantom的onError处理器。

  • page.onCreate:当page创建子窗口时触发,例如在page上下文中使用 window.open,但是子窗口再创建子窗口不会触发此事件。

  • page.onResourceRequested:当页面请求一个资源时触发的事件,它接受两个参数,

  • 第 一个参数是 requestData对象,它有如下属性:id : 资源请求编号method : http请求方法,get/post等url:请求的URLtime : 一个Date object,包含响应接收的时间headers : http头部的信息列表。第二个参数是networkRequest实例,它包含3个方法:

    abort():中断当前的请求。这样做会触发onResourceErrorchangeUrl(url):改变当前请求的目标urlsetHeader(key, value):修改/添加http头部信息

  • page.onResourceReceived: 当一个资源请求的响应接收到后触发此事件,它接受一个 response对象,这个对象有如下属性:id : 资源请求编号url:请求的URLtime : 一个Date object,包含响应接收的时间headers : http头部的信息列表bodySize : 已接收到的数据大小(全部数据或已接收的部分数据)contentType : 指定的内容类型redirectURL : 如果是一个重定向响应,那么此处是重定向到的urlstage : “start”/ “end”status : http状态码,如:200statusText : http状态描述,如:OK

  • page.onResourceError:当资源加载失败时,触发此事件。它接收一个 resourceError对象,这个对象有如下属性:id:资源请求的编号,url:请求的URL,errorCode:错误代码,errorString:错误信息。参考如下示例

    page.onResourceError = function(resourceError) {
        console.log('Unable to load resource (#' + resourceError.id + 'URL:' + resourceError.url + ')');
        console.log('Error code: ' + resourceError.errorCode + '. Description: ' + resourceError.errorString);
    };
  • page.onResourceTimeout:在讲 page.settings时曾经提到过这个事件。如果设置了 page.settings.resourceTimeout,并且资源在这个时间内没有载入完成,则会触发此事件,它接受一个 request对象,这个对象包含如下属性:
    • id : 资源请求编号
    • method : http请求方法,get/post等
    • url:请求的URL
    • time : 一个Date object,包含响应接收的时间
    • headers : http头部的信息列表
    • errorCode:错误代码
    • errorString:错误信息
最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务