我在用 selenium 做一个 WEB 类系统的自动化测试。在测试过程中,我想 hook 掉这个 web 系统的前端 js 中的某个函数。通过 selenium 是可以运行 js 代码的,这也为通过其做自动化测试时,hook 掉前端 js 代码中某个函数提供了方法。
我已经通过 selenium 提供的 driver.execute_script() 方法,实现了 hook 某些函数,例如:
例子一:修改某个函数的返回值:
// 原函数:
function add(a, b) {
alert('原始add函数')
old_add_result = a + b
console.log('原始add函数计算结果', old_add_result)
}
// hook函数:
query = """
var old_add = add
add = function (param1, param2) {
alert('hook函数')
console.log('通过hoot得到的计算结果', 10)
var result = old_add.apply(this, arguments)
return 10
}
var new_result = add(1, 2)
console.log('最终计算结果', new_result)
"""
driver.execute_script(query)
运行上述 py 代码后,成功 hook 了原来的 add 函数,最终得到的结果是:
通过hoot得到的计算结果 10
原始add函数计算结果 3
最终计算结果 10
例子二:实现在被测系统的页面上点击右键时,弹一个 alert。具体方法如下:
query = """
document.oncontextmenu = function(){
return false;
};
document.onmousedown = function(evt){
if(evt.button == 2){
alert("监听到鼠标右键被按下");
// debugger;
evt.preventDefault()
return false;
}
}
"""
_browser.execute_script(query)
疑问:
我想 hook 我的被测系统的 js 文件中的某些函数时,却遇到了困难。被测系统的采用好像是采用 SeaJs 的框架。我不懂 js 前端框架,不知道该怎么 hook 按照这种方式定义的函数。我需要 hook 的函数是下图中的 dockSystemCommon.ecimcMustCollectCheck(param) 函数:
找到上述函数定义:
可以看出这个函数是定义在 “define(function (require, exports, module)” 中,我也不知道这个是什么意思。还有就是这个函数 ecimcMustCollectCheck(param) 函数前面还有个 exports。
求助:想问下,应该怎么才能 hook 掉按照这种方式定义的前端页面 js 函数。