Selenium 关于自动化测试中,hook 掉 web 类项目的前端 js 文件中某个函数的疑问

Aiden · 2022年10月10日 · 最后由 Aiden 回复于 2022年10月11日 · 6311 次阅读

我在用 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 函数。

共收到 3 条回复 时间 点赞

可以通过 debug 看看你这个方法最后放在哪个上下文里?

有个未尝试的想法,可以替换 selenium-wire 试试:
用 interceptor 来替换对应 js 的内容:
api 的文档中有个例子,这里是 html 文件,可以尝试改成 js 文件试试:

def interceptor(request):
    if request.url == 'https://server.com/some/path':
        request.create_response(
            status_code=200,
            headers={'Content-Type': 'text/html'},  # Optional headers dictionary
            body='<html>Hello World!</html>'  # Optional body
        )

driver.request_interceptor = interceptor
恒温 回复

大佬说的详细一点哈,找到放在哪个上下文里以后呢?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册