运用D.O.H进行Javascript应用程序测试(一)

JS逆向实战:破解翻译接口加密签名参数h的完整指南 在Web开发与数据采集领域,接口签名校验是一种常见的安全机制,用于验证请求的合法性,防止未授权访问和简单的脚本攻击。其核心原理是客户端根据预定的算法(如哈希函数或自定义加密),将请求参数与密钥结合生成一个唯一的签名(signature),服务器端以相同逻辑验签。这项技术对于保障API通信安全、实现反爬虫策略具有重要价值,广泛应用于各类在线服务,如翻译、地图、社交平台等。本文聚焦于一个典型应用场景:逆向分析某在线翻译接口的动态加密参数“h”。通过结合【JS逆向】与【Python爬虫】技术,我们将深入剖析如何定 阅读详情

D.O.H的文档不太多,最重要的两篇(没有更多的了)应该是Unit testing Web 2.0 applications using the Dojo Objective Harness或者Unit Testing Custom Code with the Dojo Objective Harness。本篇先从Unit testing Web 2.0 applications using the Dojo Objective Harness(以下简称篇一)的例子入手,再沿着Unit Testing Custom Code with the Dojo Objective Harness的思路解析一下DOH框架的运用。

篇一给出的例子如下:

被测试代码:

dojo.provide("demo.doh.demoFunctions");

//This file contains a collection of helper functions that are not
//part of any defined dojo class.

demo.doh.demoFunctions.alwaysTrue = function() {
  //  summary:
  //    A simple demo helper function that always returns the boolean true when 
  //    called.
  //  description:
  //    A simple demo helper function that always returns the boolean true when 
  //    called.
  return true; // boolean.
};

demo.doh.demoFunctions.alwaysFalse = function() {
  //  summary:
  //    A simple demo helper function that always returns the boolean false when 
  //    called.
  //  description:
  //    A simple demo helper function that always returns the boolean false when 
  //    called.
  return false; // boolean.
};

demo.doh.demoFunctions.isTrue = function(/* anything */ thing) {
  //  summary:
  //    A simple demo helper function that returns true if the thing passed in is
  //     logically true.
  //  description:
  //    A simple demo helper function that returns true if he thing passed in is 
  //    logically true.
  //    This means that for any defined objects, or Boolean  values of true, it 
  //    should return true,
  //    For undefined, null, 0, or false, it returns false.
  //  thing:
  //    Anything.  Optional argument.
  var type = typeof thing;
  if (type === "undefined" || thing === null || thing === 0 || thing === false) {
    return false; //boolean
  }
  return true; // Boolean
};

demo.doh.demoFunctions.asyncEcho = function(/* function */ callback,
                                                    /* string */ message){ 
  //  summary:
  //    A simple demo helper function that does an asynchronous echo 
//     of a message.
  //  description:  
  //    A simple demo helper function that does an asynchronous echo 
//      of a message.
  //    The callback function is called and passed parameter 'message' 
//       two seconds 
  //    after this helper is called.
  //  callback:
  //    The function to call after waiting two seconds.  Takes one
//       parameter, 
  //    a string message.
  //  message:
  //    The message to pass to the callback function.
  if (dojo.isFunction(callback)) {
    var handle;
    var caller = function() {
      callback(message);
      clearTimeout(handle);
      handle = null;
    };
    handle = setTimeout(caller, 2000);
  }
};


测试代码是:

dojo.provide("demo.doh.tests.functions.demoFunctions");

//Import in the code being tested.
dojo.require("demo.doh.demoFunctions");

doh.register("demo.doh.tests.functions.demoFunctions", [
     function test_alwaysTrue(){
          //     summary:
          //          A simple test of the alwaysTrue function
          //     description:
          //          A simple test of the alwaysTrue function
          doh.assertTrue(demo.doh.demoFunctions.alwaysTrue());
     },
     function test_alwaysFalse(){
          //     summary:
          //          A simple test of the alwaysFalse function
          //     description:
          //          A simple test of the alwaysFalse function
          doh.assertTrue(!demo.doh.demoFunctions.alwaysFalse());
     },
     function test_isTrue(){
          //     summary:
          //          A simple test of the isTrue function
          //     description:
          //          A simple test of the isTrue function with multiple permutations of 
           //          calling it.
          doh.assertTrue(demo.doh.demoFunctions.isTrue(true));
          doh.assertTrue(!demo.doh.demoFunctions.isTrue(false));
          doh.assertTrue(demo.doh.demoFunctions.isTrue({}));
          doh.assertTrue(!demo.doh.demoFunctions.isTrue());
          doh.assertTrue(!demo.doh.demoFunctions.isTrue(null));
          doh.assertTrue(!demo.doh.demoFunctions.isTrue(0));
     },
     {
          //This is a full test fixture instead of a stand-alone test function.  
          //Therefore, it allows over-riding of the timeout period for a deferred test.  
          //You can also define setup and teardown function
          //for complex tests, but they are unnecessary here.
          name: "test_asyncEcho",
          timeout: 5000, // 5 seconds.
          runTest: function() {
               //     summary:
               //          A simple async test of the asyncEcho function.
               //     description:
               //          A simple async test of the asyncEcho function.
               var deferred = new doh.Deferred();
               var message  = "Success";
               function callback(string){
                    try {
                         doh.assertEqual(message, string);
                         deferred.callback(true);
                    } catch (e) {
                         deferred.errback(e);
                    }
               }
               demo.doh.demoFunctions.asyncEcho(callback, message);
               return deferred;      //Return the deferred.  DOH will 
                                     //wait on this object for one of the callbacks to 
                                     //be called, or for the timeout to expire.
          }
     }
]);


上面的测试代码已经包含了DOH框架,我们先运行起来看看结果。同样,为避免烦琐的运行环境设置,我们仍然使用firebug来完成全部工作。在跟着教程学习时常遇到的最大问题就是环境问题…如果全部工作都能在firebug中完成的话,那么显然是最简单的了–不过仍然还是有一点点环境设置的:

首先,通常我们可以使用Google的CDN发行的dojo,但是遗憾的是,这个发行中并不包含DOH框架,所以,我们需要去dojotoolkit.org下载它的完整发行包,并使用Apache/Nginx等server来host它。这个过程省去不写,假设最后dojo安装完成后可以通过http://example.com/dojolib/dojo/dojo.js来访问。检查一下这两个链接是否可以访问:

http://example.com/dojolib/util/doh/runner.js

http://example.com/dojolib/util/doh/_browserRunner.js

其次,你需要参照如何向网页动态注入dojo这篇文章了解如何向网页动态注入dojo。

假设你已经完成了上面的准备。现在,使用Firefox打开任意一个网页,并启动Firebug。点击bookmarklet向该网页注入dojo。然后在firebug控制台中输入以下命令,以注入DOH:

loadModule(“http://example.com/dojolib/util/doh/_browserRunner.js“);

loadModule(“http://example.com/dojolib/util/doh/runner.js“);

略等一会儿,在firebug中输入ls(doh),如果出现:

image

OK,DOH已经被注入到该网页当中了。这里有两个地方要注意:

loadModule和ls通过如何向网页动态注入dojo一文中提到的方法,向当前窗口注入的两个函数。其中loadModule的作用是将一个URL所指定的脚本文件注入到当前网页。而ls===console.dir()函数。

下面,将上文中的被测试代码和测试代码输入到firebug控制台窗口并运行。此时不会看到任何反馈。再运行下面的命令,完成单元测试:

doh.run();

doh.run()是DOH框架测试的主要入口,也是我们后面自己写测试页面需要调用的函数。

 

可是,什么结果也没有啊?教程里象下面这样的华丽界面呢?

image

显然,当我们通过firebug运行DOH时,不能期望上面的界面,只能看到命令行输出。但是,为什么命令行输出也没有呢?

doh._report()函数用来报告测试结果,但在正常的测试环境下(比如通过util/doh/runner.html运行),它被替换成跟环境相关的函数,而在我们这个测试环境中,仍然使用它原来定义的行为来输出测试结果。这个函数本身是这样定义的:

doh._report = function(){
	// summary:
	//		a private method to be implemented/replaced by the 'locally
	//		appropriate' test runner

	// this.debug('ERROR:');
	// this.debug('\tNO REPORTING OUTPUT AVAILABLE.');
	// this.debug('\tIMPLEMENT doh._report() IN YOUR TEST RUNNER');

	this.debug(this._line);
	this.debug('| TEST SUMMARY:');
	this.debug(this._line);
	this.debug('\t', this._testCount, 'tests in', this._groupCount, 'groups');
	this.debug('\t', this._errorCount, 'errors');
	this.debug('\t', this._failureCount, 'failures');
}
如果你看看debug()函数的定义,你会发现它什么也不做。因此,我们需要将其替换为console.log:

doh.debug = console.log

现在,再次运行doh.run(),现在你会得到:

image

注意本例的输出结果应该是4 tests to run in 1 groups,而非截屏中的8 tests。看起来这个例子并不太好,因为我们想看一下出现错误的情况。把被测试代码中任意一个函数的实现改成错误的实现,比如,让alwaysTrue返回false。再次重复上面的步骤,这次我们得到:

image

啊哈!没有繁琐的编写HTML,部署和设置,略微做了一点hack,我们就有了一个可能是史上部署最快的DOH测试。

最后,完整的代码附在附件中。你可以将文件打开,将代码拷贝到firefox命令窗口中运行。注意在加载DOH后(文件的前两行),要等一会儿才可以继续运行余下的代码。

注:有时候测试会因为 runner.js(1.61版)第1299行的if(this._paused){ return; }导致测试中止且没有结果输出。可以将这一行注释掉。在附件中该行已注释。


优快云不支持js的附件,请访问http://www.lotus-scent.com/blog以获取附件。

基于Node.JS、Vue和Vite的D3数据可视化学习 Node.js :是运行在服务端的 JavaScript。Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。 目的:前后端完全分离 后端Python/Java 前端Node.js Vue: The Progressive JavaScript Framework 目前最为流行的前端框架之一,不可否认的是它相比 React 的学习曲线要更为平缓。 NPM/Yarn:他们都是包管理⼯具,NPM... 阅读详情

相关推荐

ManhVu的Node.js后端开发项目 - Tecinus技术栈

本文还有配套的精品资源,点击获取 简介:标题暗示了这可能是一个由开发者ManhVu创建的后端项目,且可能使用了Tecinus技术栈或框架。从标签中得知,项目主要使用JavaScript语言,这表明它可能是基于Node.js平台的后端应用。虽然项目详情未明,但可以推测它可能涉及Node.js的多个特性,如事件驱动编程、非阻塞I/O、模块系统、Express框架、数据库集成、R...

weixin_42608318的博客 660

模式对话框中dtree出现javascript:%20d.o(11)错误解决办法

dtree代码放到模态对话框中,点+号的时候弹出了一个新的窗口(地址栏为javascript:%20d.o(1);)的解决办法:在树的模态对话框页面加上的head标签里添加: <base target="_self">即可解决。 <head> <base target="_self"> </head>  ...

heweina2007的专栏 694

ESWA投稿全流程避坑指南:从LaTeX模板到审稿状态查询(附最新资源链接)

本文提供了一份详尽的ESWA期刊投稿全流程指南,涵盖从LaTeX模板深度适配、Cover Letter撰写,到Editorial Manager系统操作、审稿状态解析等关键环节。重点解析了投稿准备中的常见“雷区”与文件合规性要求,并分享了收到审稿意见后的高效修改与回复策略,旨在帮助研究者规避流程陷阱,提升投稿效率与成功率。

9o8p7i6u5y的博客 838

运用D.O.H进行Javascript应用程序测试(二)

文章“运用D.O.H进行Javascript应用程序测试(一)”使用firebug和Javascript注入技术快速展示了D.O.H的功能和基本用法。主要是: 通过 dojo.provide("demo.doh.tests.functions.demoFunctions"

博客只是岁月的记录 1434

路径规划:D*Lite寻路算法详解

D*Lite详解目录

mkr67n的博客 2万+

卷王问卷考试系统——测试报告

本问卷考试系统是一款在线平台,支持用户发布和完成调查问卷,并进行考试管理,核心功能在于简化问卷创建发布、数据收集及考试组织流程。此次测试将围绕其关键模块展开,涵盖用户注册登录、项目列表、我的练习以及我的题库等核心部分。问卷考试系统(一)硬件环境普通办公电脑(CPU:Intel i5 、内存:16GB 、硬盘:512GB )(二)软件环境操作系统:Windows 11 ;浏览器:Chrome(版本 120+)、Firefox(版本 115+)、Edge(版本 120+)验证界面信息在完整性、一致性、准确性和用

m0_73433755的博客 555

H.O.O.D. 开源项目指南

H.O.O.D. 开源项目指南 项目介绍 H.O.O.D.(具体含义未在提供信息中明确,假设为“ Highly Optimized Open-source Development”)是一个假想的开源技术项目,旨在通过先进的技术和框架,为开发者社区提供高效、可扩展的解决方案。该项目基于GitHub托管,地址是:https://github.com/Dolorousrtur/HOOD.git。它设计...

gitblog_01157的博客 620

基于线性光耦HCNR200的高压直流采样电路设计与精度优化

本文详细介绍了基于线性光耦HCNR200的高压直流采样电路设计与精度优化方法。针对直流高电压测量中的安全与干扰问题,提出采用HCNR200光耦隔离方案,实现高精度线性传输。文章深入解析电路设计关键细节,包括电阻网络、运放选型、滤波电容配置等,并提供精度优化实战技巧与常见问题排查指南,助力新能源电动汽车和高压储能系统的高压直流采样应用。

weixin_42713608的博客 580

js/d3.min.js_在5分钟内学习D3.js

js/d3.min.jsby Sohaib Nehal 通过Sohaib Nehal 在5分钟内学习D3.js (Learn D3.js in 5 minutes) 创建数据可视表示的简介 (An introduction to creating visual representations of your data) D3.js is a JavaScript library used t...

cumi6497的博客 1887

从零搭建医疗化验单识别系统:深度学习+OCR实战教程(附数据集)

本文详细介绍了如何从零开始构建一个医疗化验单智能识别系统。通过融合深度学习和OCR技术,系统能够应对版式多样、内容专业的医疗单据,实现从文本检测、识别到关键信息结构化抽取的全流程。文章提供了数据集处理、模型选型、训练微调及工程化部署的实战指南,并分享了避坑经验与性能优化策略,为开发者解决医疗信息化痛点提供了完整的技术方案。

k9l0m1的博客 493

我正用AI Agent重构传统GIS 核心功能,说大白话做空间分析

GeoAI-UP项目通过AI Agent技术实现自然语言驱动的空间分析,核心创新包括: 意图识别层:通过LLM理解用户需求,自动拆解为可执行目标 智能任务规划:动态生成分析流程,处理复杂依赖关系 统一算子架构:采用标准化接口封装200+空间分析功能 可视化工作流。

专注GIS软件开发。 496

(翻译)D.O.H: Dojo Objective Harness I

原文来自 http://dojotoolkit.org/reference-guide/util/doh.html Overview Usually when people think of a scripting language, it’s often in context of ease of use, simple syntax, and something those without...

iteye_7706的博客 240

Silly Tavern酒馆ai角色卡与世界书导入超详细教程!

前几天,我在设置 Silly Tavern 的时候,想导入一个喜欢的角色卡,结果发现不少朋友其实已经下载好了角色资源,但却不知道怎么正确导入使用。这篇文章就作为一份完整的新手向教程,一步步教你如何在 Silly Tavern 中导入角色卡、世界书,并实现与 AI 角色的真实互动。如果你是第一次接触这个功能,建议先收藏慢慢看~点击菜单栏上的 图标,打开角色界面。初始状态下,你应该只看到默认角色 Seraphina。你可以先点击她的头像尝试聊天,也可以导入自己喜欢的角色。点击导入按钮,选择你下载好的角色卡(通

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2万+

掌握 JavaScript 跨浏览器测试

跨浏览器测试在 Web 开发中至关重要,以确保您的应用程序在不同的浏览器和设备之间无缝运行。让我们深入研究跨浏览器测试的各个方面,通过简单的标题和代码示例来说明每一点。跨浏览器测试简介跨浏览器测试可确保您的 Web 应用程序在不同 Web 浏览器及其版本上的行为一致。它有助于识别和修复由于不同浏览器对 Web 标准的不同实现而可能出现的兼容性问题。为什么跨浏览器测试很重要?执行测试的策略有效的跨浏览器测试需要一种涵盖所有基础的战略方法。1. 定义您的目标浏览器确定目标受众最常用的浏览器和版本。

liangshanbo1215的博客 792

metahuman 下载材质 脸部灰白 脸部过亮

metahuman 下载材质 脸部灰白 脸部过亮

jacke121的专栏 244

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

基于D3js以及Neo4j的知识图谱系统开发

因为要做这个知识图谱,对这方面完全是小白 D3js和这个Neo4j是啥咱也不清楚,学呗! 前置知识 D3.jshttps://www.d3js.org.cn/ 据说,不同版本之间的坑很多(怎么办,我也很绝望) D3js 是一个可以基于数据来操作文档的 JavaScript 库。可以帮助你使用 HTML, CSS, SVG 以及 Canvas 来展示数据。D3 遵循现有的 Web 标准,可以不需要其他任何框架独立运行在现代浏览器中,它结合强大的可视化组件来驱动 DOM 操作。 最新发行版或者插入如下代码来在线

littleyy666的博客 6123

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

5分钟搞定IoT数据可视化:ThingsBoard中Chart.js与D3.js深度测评

你是否还在为IoT平台的时序数据可视化选型发愁?面对Chart.js的简易配置和D3.js的无限定制,如何在开发效率与视觉效果间找到平衡?本文将通过ThingsBoard平台的实际应用场景,对比两种可视化方案的核心差异,帮助你3步实现设备数据仪表盘的最优配置。 ## 技术选型痛点解析 在工业物联网场景中,设备每秒产生的温度、压力等时序数据需要实时转化为直观图表。ThingsBoard作为开源I

gitblog_01102的博客 715

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

javaScript的单元测试题

把自己做的一些测试题整理了发出来,如果对你有用,可以点赞关注,共同学习。 JavaScript的单元测试题第一、二章理论知识测试题第二章实操第三章测试题第四章测试题第四章实验操作测试题第五章理论知识测试第五章实验操作测试题第六章理论知识测试题 第一、二章理论知识测试题 第二章实操 第三章测试题 第四章测试题 1、下列( )表达式产生一个0~7之间(含0,7)的随机整数。 A、Math.floor(Math.random()*6) B、Math.floor(Math.random()*7.

新白的博客 9300

d3.js基础

本文引用 极客学院的d3基础教程 d3添加文字 d3.select('svg').append('text') .text('测试api') .attr({ // 需要修改源码支持object输入 x: 300,y:300,fill:'red', dx: 20, // 偏移 }) ...

coding 330

QUnit——对JavaScript 进行单元测试的利器

QUnit——对JavaScript 进行单元测试的利器 1.QUnit下的简单测试: 简单说明(本次框架采用的是QUnit-V2.0.0版本): 如上图:从左到右从上倒下一次说明如下: a.QUnit.module()是定义当前测试用例属于哪个模块下。注意:对于V1.0.0版本中不需要QUnit,对于V2.0.0中必须添加QUnit.开始。 b.QUnit.test

chr23899的专栏 2286

编写Vue.js的单元测试

Vue.js是一个JavaScript框架,可用于构建Web应用程序的前端框架。特别是在创建复杂功能时,对于每个项目,有必要在我们的应用程序中查看所有内容,并检查它是否符合预期。然而,对于大型项目,每次新的更新后,检查每个功能将变得很麻烦。因此,我们可以创建可以一直运行的自动化测试,并保证我们的代码可以正常运行。在本文中,我们将为VueJS创建一些简单的单元测试。 要进行测试,我们将先制作一个基...

hejiaying68的博客 189

Dojo 的单元测试框架D.O.H的使用

     刚刚接触doh时,发现doh的主要js文件-runner.js的中有很多的方法的实现和dojo相同,查看了dojo的官方文档,原来doh可以不依赖dojo单独使用,不过使用起来变得复杂不少,脱离dojo,不能够使用dojo.require将js文件引入,需要注意路径问题。      配置doh的方法比较简单...

玩熊的 256

js测试框架:mocha学习总结

一、总结 教程引用自:阮大神的文章 1.1 Mocha 是现在最流行的JavaScript测试框架之一,在浏览器和Node环境都可以使用。 所谓”测试框架”,就是运行测试的工具。通过它,可以为JavaScript应用添加测试,从而保证代码的质量。 除了Mocha以外,类似的测试框架还有Jasmine、Karma、Tape等,也很值得学习。 # 安装 npm install ...

Sophie_U的博客 2008

c调用javascript

操作步骤: 1、下载获得js-1.60.tar.gz的tarball并解压,下载地址:http://ftp.mozilla.org/pub/mozilla.org/js/ 2、 用vc6打开src目录下的js.mdp,vc6会提示你转换到新版的dsp,确定会得到3个dsp工程文件; 3、 分别设定这三个文件为Active Project同时分别编译得到js32.dll和js32.lib 4

hytcfengxue的专栏 1974

js代码调用c++代码的测试

根据前面的博客对JS调用C++的代码进行了测试,在Node里面加了jsbTest的方法进行Android打包测试。 1.编写coco2dx层的方法 CCNode.h virtual int jsbTest() const; CCNode.cpp  int Node::jsbTest(void) const { return 100; }2.编写js层的方法 jsb_cocos2

叶巷的博客 2485

Google V8 JavaScript应用测试实例

上一篇整理的Google  V8 Javascript 引擎的编译,接下来在cygwin下面进行个应用测试,看看这个引擎如何实现JavaScript的。 吐槽:在浏览上编程都n年了,如今从底层来看看这些如何来实现,相信有兴趣的人都会忍不住的。一起来吧; 准备好文件: 头文件 /usr/include/v8.h 类文件 /usr/lib/libv8.so 接下来准备,在v8的源码中

huareal的专栏 2501
上一篇: Firefox 7 has just released!
下一篇: Dojo 1.7的新功能-aspect
yaaron
博客等级 码龄19年 7粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值