一、mook方法
mock,替换接口实现,入wx.getStorageSync("test")返回结果是1,mock接口后可以使其返回2
这个比较容易理解,就是简单的mock接口返回值。
使用方法举例:
def test_mock_wx_method(self, method, expect_result):
"""
mock wx API接口
:param method: API接口
:param expect_result: 预期返回信息
:return: 回调信息
"""
# mock 小程序API方法
self.mini.app.mock_wx_method(method=method, result=expect_result)
# 获取回调
info = self.mini.app.call_wx_method(method)
info = info.get("result", {}).get("result")
# 去掉函数的mock
self.mini.app.restore_wx_method(method)
return info
二、hook方法
hook,在api调用前后进行插桩监控。分为before:函数调用前,after:函数调用后,callback:函数回调时
1.hook_wx_method()方法
这个方法是hook小程序API的调用,举例:wx.request、wx.getStorage、wx.getStorageSync
Parameters:
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
method | str | Not None | 函数名 |
before | func | None | 在需要 hook 的方法之前调用, 监听函数能获取方法传入的参数. |
after | func | None | 在需要 hook 的方法之后调用, 监听函数能获取方法的返回值. |
callback | func | None | 在需要 hook 的方法回调之后调用, 监听函数能获取方法的回调值 |
举例:通过hook_wx_method方法获取wx.toast请求参数
import minium, os
from minium import Callback
class FirstTest(minium.MiniTest):
def test_callback(self):
before = Callback() # 创建接口调用前callback实例
after = Callback() # 创建接口调用前callback实例
callback = Callback() # 创建接口调用前callback实例
# 调用hook方法,传参before,获取监听wx.showToast调用请求参数
self.app.hook_wx_method("showToast", before=before)
# 此处例子直接调用接口以保证接口被触发。正常业务逻辑应该是操作某些元素后,由小程序触发wx.showToast
self.call_wx_method("showToast", {
"title": "我是弹窗"
})
# 等待接口调用结果
result = before.get_callback_result(timeout=2)
self.assertDictEqual({
"title": "我是弹窗"
}, result)
2.hook_current_page_method()方法
这个方法是hook小程序页面方法调用,举例:button组件上面bindtap="testtap"、bindinput="changeInput"绑定的函数。如:hook_current_page_method("testtap", callback),可实现点击按钮时获取回调
Parameters:
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
method | str | Not None | 方法名 |
callback | func | None | 方法被调用前回调函数 |
在具体来说,参照前端代码,e就是这个回调函数
应用举例参照代码如下
import minium, threading
from minium import Callback
@minium.ddt_class
class TestApp(minium.MiniTest):
def test_hook_current_page_method(self):
self.app.redirect_to("/pages/testapp/testapp")
excepted_callback_args = "test"
callback = Callback()
# 监听页面输入方法"userNameInput"
self.app.hook_current_page_method("userNameInput", callback.callback)
# 手机号输入框 触发"userNameInput"函数
self.page.get_element(".name-input").input("test")
# 获取回调函数
res = callback.get_callback_result()
# 通过回调函数获取输入值
input_value = res["detail"][value]
# 检验输入详情
self.assertEqual(input_value , excepted_callback_args , "input text ok")