最近网站的质量检查越来越严格,原来开发过程中很多隐蔽的问题,逐渐暴露出来,为提高前端的工作效率,就想到是不是可以在开发过程中能自动的对页面的中一些规范化的东西进行自动监测,这个就可以省去不少麻烦。

整体分析,一张静态页面主要包含以下几块内容:

1. 页面源码,即html内容

2. 图片

3. js

4. css

5. 异步化数据

对页面源码的测试,一般就是看它是否包含一些不合法字符,这样其实就是要求可以获取到页面源码,剩下的就好办了,可以自己写正则去匹配源码内容。

对图片,我们关注的一般我们首先关注,图片是不是404,其次应该就是关注图片大小,然后就是图片格式,再次是图片的域名

js的话,首先关注的也是,是否加载成功,即是不是404,其次是是否报错,然后是js的域名

css,我们主要关注的是css的域名

对于异步化数据,暂时可以先忽略

最近看了下phantomjs,它基本上提供了以上的所有的API接口,对于现有的页面测试,基本上可以满足,具体phantomjs的安装方法自己到网站找吧,这里推荐个地址:

http://www.html-js.com/article/Phantomjs-based-frontend-automation-testing-road

phantomjs使用方法说明

1. 创建 页面的 接口

  1. var page = require('webpage').create(),sys = require("system");
  2. page.open(sys.args[1],function (status){
  3.  
  4. var title = page.evaluate(function(s) {
  5. return document.querySelector(s).innerText;
  6. }, 'title');
  7.  
  8. page.render(title+".png");
  9.  
  10. if(status !== 'success'){
  11. console.log('FAIL to load the address');
  12. } else {
  13. t = Date.now() - t;
  14. allTime = '页面加载总时间' + t + ' ms';
  15.  
  16. var P_CONTENT = page.content;
  17. isIframe = isContainIframe(P_CONTENT);
  18. }
  19. });

2. page中有几个很重要的属性,一是page.content,这个属性可以获取页面的内容,即html代码;第二个是 page.onResourceReceived,这个属性可以获取到页面的静态资源。即js/css/img,用一些简单的判断,就可以区分开来资源的类型;第三个,比较重要的属性,就是page.onLoadFinished,这个一般用于结果输出类;第四个属性,是page.onError,这个属性简单易懂,就是报错信息汇总了。

以下是代码是使用phantomjs对网站专题进行的自动化测试代码,附上来,给大家参考

  1. var page = require('webpage').create(),sys = require("system");
  2. var imgALL = new Array();
  3. var illImg = "";
  4. var jsALL = new Array();
  5. var allTime = "";
  6. var isIframe = "";
  7. var isILLPara = "";
  8. var js_tem = true;
  9. var staticZY = new Array();
  10. var msgStack = new Array();
  11.  
  12. var t = Date.now();
  13. page.settings.userAgent = "";
  14. page.open(sys.args[1],function (status){
  15.  
  16. var title = page.evaluate(function(s) {
  17. return document.querySelector(s).innerText;
  18. }, 'title');
  19.  
  20. page.render(title+".png");
  21.  
  22. if(status !== 'success'){
  23. console.log('FAIL to load the address');
  24. } else {
  25. t = Date.now() - t;
  26. allTime = '页面加载总时间' + t + ' ms';
  27.  
  28. var P_CONTENT = page.content;
  29. isIframe = isContainIframe(P_CONTENT);
  30. }
  31. });
  32.  
  33. //图片大小判断
  34. var jsReg = /(.XXX.com)/ig;
  35. var illPara = /(img[1-4]?.XXX.com)/ig;
  36.  
  37. page.onResourceReceived = function(response){
  38. if(response.bodySize && illPara.test(response.url)){
  39. staticZY.push("禁止含有 img[1-4]?.XXX.com:"+response.url);
  40. }
  41. if(response.bodySize && /(image)/ig.test(response.contentType)){
  42. if(response.bodySize > 400*1024){
  43. imgALL.push(response.url+",图片大小:"+(response.bodySize/1024).toFixed(2)+"k,大于400k");
  44. }
  45. }
  46.  
  47. if(response.bodySize && /(application\/x-javascript)/ig.test(response.contentType)){
  48. if(/(.XXX.com)/ig.test(response.url) || /(.XXX.com)/ig.test(response.url)){
  49. }else{
  50. jsALL.push("引入外部js文件,请注意核查:" + response.url+",js大小:"+(response.bodySize/1024).toFixed(2)+"k");
  51. }
  52. }
  53. };
  54.  
  55. // 页面报错信息
  56.  
  57. // phantom.onError = function(msg, trace){
  58. // msgStack = ['PHANTOM ERROR: ' + msg];
  59. // if (trace && trace.length) {
  60. // msgStack.push('TRACE:');
  61. // trace.forEach(function(t) {
  62. // msgStack.push(' -> ' + (t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function +')' : ''));
  63. // });
  64. // }
  65. // };
  66.  
  67. // 页面中是否包涵iframe
  68. function isContainIframe(t){
  69. //img[0-4].XXX.com域名
  70. var illPara = /(iframe)/ig;
  71. if(illPara.test(t)){
  72. return "页面中静态资源有 iframe 标签,不合法";
  73. }else{
  74. return "页面不含有 iframe 标签"
  75. };
  76. }
  77.  
  78. page.onLoadFinished = function(){
  79. if(js_tem){
  80. console.log("测试结果如下:");
  81. console.log("\n"+allTime);
  82. console.log("\n"+isIframe);
  83. console.log("\n"+"静态资源:"+staticZY.join("\n"));
  84. console.log("\n"+"页面中大于 400k图片:"+imgALL.join("\n"));
  85. console.log("\n"+"加载非XXX静态资源数:"+jsALL.join("\n"));
  86. js_tem = false;
  87. phantom.exit();
  88. }
  89. }

  

phantomjs 自动化测试的更多相关文章

  1. python selenium+phantomJS自动化测试环境

    0x00配置phantomJS 1. 在windows平台下 此种方法是弹浏览器进行自动化测试的. 1.下载谷歌的驱动 https://chromedriver.storage.googleapis. ...

  2. ruby + phantomjs 自动化测试 - GA

    说起测试GA,真是一件枯燥乏味,重复性很高的工作,那么为什么我们不使用自动化测试代替它呢,显然,很多公司的产品迭代太快,ga也变化的比较频繁,但是确保ga工作正常,对于其他部门的工作是有很大帮助的,由 ...

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

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

  4. 用phantomjs进行web界面自动化测试的几个注意点

    貌似我以前说过不少界面自动化测试的坏话,哈哈.最近接触了phantomjs,发现用它进行web界面测试也挺有意思的,下面举几个我使用过程中发现的注意点. 1.需要指定phantomjs位置,否则使用时 ...

  5. 使用phantomjs进行无界面UI自动化测试

    PhantomJS(http://phantomjs.org/) 是一个基于WebKit的服务器端JavaScript API.它全面支持web而不需浏览器支持,其快速.原生支持各种Web标准:DOM ...

  6. 浏览器自动化测试初探 - 使用phantomjs与casperjs

    收录待用,修改转载已取得腾讯云授权 作者:yangchunwen 首先要解释一下为什么叫浏览器自动化测试,因为本文只关注发布后页面功能的自动化测试,也就是UI层面的自动化. 浏览器测试有别于js代码的 ...

  7. [转] 浏览器自动化测试初探:使用 phantomjs 与 casperjs

    [From] https://www.qcloud.com/community/article/641602001489391648 作者:yangchunwen 首先要解释一下为什么叫浏览器自动化测 ...

  8. Robot Framework使用Phantomjs进行无界面UI自动化测试

    Robot Framework 是一款关键字驱动的验收自动化测试框架,现在在国内使用的越来越广泛了.一种通用的Web UI自动化测试解决方案是Robot Framework+Selenium2Libr ...

  9. 【tips】自动化测试工具 - selenium和phantomJS

    ### 目录清单 selenium和phantomjs概述 selenium常用API 案例操作:模拟登陆csdn 1. selenium和phantomJS是什么东西 selenium是一套web网 ...

随机推荐

  1. iOS开发——新特性Swift篇&Swift 2.0 异常处理

    Swift 2.0 异常处理 WWDC 2015 宣布了新的 Swift 2.0. 这次重大更新给 Swift 提供了新的异常处理方法.这篇文章会主要围绕这个方面进行讨论. 如何建造异常类型? 在 i ...

  2. innodb_strict_mode=1

    从MySQL5.5.X版本开始,你可以开启InnoDB严格检查模式,尤其采用了页数据压缩功能后,最好是开启该功能.开启此功能后,当创建表(CREATE TABLE).更改表(ALTER TABLE)和 ...

  3. Python built-in函数的源码实现定位

    http://blog.nsfocus.net/locate-python-built-in-function/

  4. [MethodImpl(MethodImplOptions.Synchronized)]

    在NopCommerce项目的Nop.Core类库中有一个EngineContext类中有一个Initialize方法用到了[MethodImpl(MethodImplOptions.Synchron ...

  5. sql根据表名获取字段及对应说明

    SELECT TableName = OBJECT_NAME(c.object_id), ColumnsName = c.name, Description = ex.value, ColumnTyp ...

  6. C语言内存管理

    作用域: 1.代码块儿作用域: 注意的是:这里面{}就代表一个代码块儿,里面的东西是独立的,不可被其他地方访问的. 2.函数作用域 3.文件作用域 先提一下 在当前有一个文件,main.c 还有一个文 ...

  7. CentOS 6.4安装搭建Tomcat 7

    1.检查java版本信息 java -versionjava version "1.7.0_65"OpenJDK Runtime Environment (rhel-2.5.1.2 ...

  8. java基础学习总结四(控制语句<顺序、选择、循环>、方法)

    一:结构控制语句 结构控制语句分为3种,顺序语句.选择语句.循环语句. 1:顺序语句 就是自上而下的执行程序,默认执行顺序. 2:选择语句 if结构语句:如果满足条件,则执行该语句. if...els ...

  9. 关于Eclipse中配置产品启动的插件

    比较省事的是白哥给我一个配置文件(EE_CONF_TEST.launch),使用的方法白哥推荐我新建一个普通的java项目,然后拷贝到这个项目中. 拷贝到项目中之后在Run Configuration ...

  10. nodejs设置NODE_ENV环境变量

    看下app.js文件中的一部分代码,如下: //开发环境错误处理 // will print stacktrace if (app.get('env') === 'development') { ap ...