互帮互助 小程序 UI 自动化 minium 遇到的问题分享,真机调试与 IDE 拨号弹框

xpcs · March 10, 2026 · 311 hits

最近在学习小程序 UI 自动化 minium,用于发版自动化回归小程序基础功能

学习资料
https://minitest.weixin.qq.com/#/minium/Python/readme

遇到两个困扰比较久的问题,断断续续占用了 5 天时间左右,给大家分享一下:
1.真机调试的连接问题
2.IDE 系统级拨号弹框,无法关闭问题

一、真机调试连接问题

我目前还没调通,老是卡在 IDE 的界面,让我选择安卓真机或者 IOS 真机,不会自动选择;

我手动点击【编译并自动调试】手机上启动小程序后,小程序展示为空白的白屏,并有错误的报错信息 cmdId 1006, errCode -1;
此时我手动,点击胶囊,重启小程序,可解决此问题,变为连接正常;但相当于自动化过程中人工干预了两次;

然后我发现真机运行自动化,速度相比 IDE 模拟器来说,慢太多;

问题排查过程:
我的配置应该是没问题的

控制台输出日志,尝试连接远程真机失败,不过会重试 3 次; 当我手动点击编译并调试,然后重启手机上的小程序后,然后等待若干年后。。。就可成功连接

IDE 的微信与跑测手机上的微信,登录的是同一个账号
我使用过 minium 版本 1.60、1.51
使用过 IDE 的版本 2.01.2510280 、1.06.2504040
尝试过不通过程序调用,直接在 IDE 上使用真机调试功能,是没有问题的
我当前系统是 mac;后续想看看 windows 的表现;但还未尝试

问题一的结论是,我弃用了真机调试;我就在 IDE 模拟器上跑测我的自动化用例
但 IDE 跑测会存在两个缺陷
1.不支持小程序内嵌 H5 的操作,H5 操作需要安卓真机调试
2.IDE 上的跑测,可能不会暴露一些兼容等问题;如之前遇到过,点击未跳转的问题,开发在 IDE 模拟器上自测正常,但我使用真机测试发现存在问题

二、IDE 系统拨号弹框,无法关闭问题

点击拨号按钮

弹出弹框

这个弹框,属于小程序原生弹框,所以不会出现在 WXML 中,所以无法定位; 且为系统级弹框(不是开发自定义的模态弹框)
我的诉求是,可以点击到确定或者取消,给弹框关了,不影响我后续跑测,我还需要断言,我正确点击了拨号按钮,拨号被触发了

问题排查思路:
我首先尝试可以通过一些 API,将这个弹框关了

# 通过返回操作 # 无法关闭系统级拨号弹框 
# self.mini.app.navigate_back(delta=2)
# sleep(2)

# 通过前往首页操作  # 无法关闭系统级拨号弹框
# self.mini.app.go_home()
# sleep(2)

# 模态弹框点击取消按钮 #  可关闭非系统级的弹框  # 无法关闭系统级,拨号弹框
# self.native.handle_modal("取消")

# self.native.stop_wechat()  # 关闭微信 # 针对IDE不生效
# sleep(2)
# self.native.start_wechat() # 打开微信 # 针对IDE不生效
# sleep(2)

# 在解决过程中,我发现,我点击拨号按钮,触发拨号弹框,还可以通过minium提供的调用微信API方法,来弹出拨号弹框
# # 人工调用微信API,模拟拨号弹框
# result = self.mini.app.call_wx_method(method="makePhoneCall", args={"phoneNumber": "111"})
# print(result)
# sleep(2)

# 尝试使用minium提供权限相关方法,来试图关闭这个弹框

# 处理微信授权弹框的通用方法,点击允许或者拒绝  #  无法关闭系统级,拨号弹框
# self.native.allow_authorize()
# sleep(3)
# 处理订阅信息授权弹窗    # 无法关闭系统级,拨号弹框
# self.native.allow_send_subscribe_message()
# sleep(3)
# 处理获取用户手机号码确认弹框  # 无法关闭系统级,拨号弹框
# self.native.allow_get_user_phone()
# sleep(5)

经过以上尝试,均无法关闭拨号弹框,但是 minium 提供另一个方法,可以让这个弹框不弹出。。。
就是监听到调用微信拨号 API,给结果 mock 掉,这样弹框就不会弹出

# # # 可以mock掉拨号弹框,要放在点击触发弹框之前 # mock后,拨号弹框不再弹出 # 但我如何断言,我点击了拨号是个问题
# self.mini.app.mock_wx_method('makePhoneCall', result={'errMsg': 'makePhoneCall:ok'})
# 点击拨号
# self.mini.page.get_element("//view[@class='brokerBooth-index--right'][1]/image[1]").click()
# print("点击拨号按钮")
# 此时拨号弹框不会弹出

但引入了一个新问题,我给拨号弹框 mock 掉了,我如何断言,我成功点击了拨号按钮,此时我发现 mock_wx_method 方法中是支持传入 functionDeclaration
即传入一个的 JS 函数定义 , 当监听到 API 被调用的时候,执行 JS 函数


在执行 JS 函数前,我们先在当前页面 data 中,定义一个拨号标识变量,然后点击拨号按钮触发我们定义的 JS,将页面中拨号标识变量改变,然后断言比拨号标识变量的状态,即可断言出拨号被成功触发,且不出现拨号弹框,不影响后续操作,完美解决拨号弹框问题,代码如下

 # 1. 获取当前页面
 page = self.mini.app.get_current_page()

 triggered = page.data.get("__phoneCallTriggered")
 print("设置页面data前 __phoneCallTriggered:", triggered)

 # 在页面 data 中初始化标志(直接通过 Python 设置) # 设置页面 data
 page.data = {"__phoneCallTriggered": False}

 triggered = page.data.get("__phoneCallTriggered")
 print("设置页面data后,mock定义前 __phoneCallTriggered:", triggered)

 # 2. JS函数定义,拨号API被调用后,会执行JS函数,函数是对  page.data 中拨号变量标识进行更改
 mock_func = """
         function(params) {
             getCurrentPages().pop().setData({ __phoneCallTriggered: true });
             return {errMsg: 'makePhoneCall:ok'};
         }
     """
 self.mini.app.mock_wx_method('makePhoneCall', functionDeclaration=mock_func)

 triggered = page.data.get("__phoneCallTriggered")
 print("mock定义后,还没触发,拨号前 __phoneCallTriggered:", triggered)

 # 3. 点击拨号按钮
 btn = self.mini.page.get_element("//view[@class='brokerBooth-index--right'][1]/image[1]")
 btn.click()
 print("点击拨号按钮")

 # 4. 等待模拟函数执行 # 相当于 sleep(1)
 self.mini.page.wait_for(1)

 # 5. 重新获取页面并读取 data
 page = self.mini.app.get_current_page()
 triggered = page.data.get("__phoneCallTriggered")
 print("拨号后,mock触发 __phoneCallTriggered:", triggered)


# 运行输出:

# 设置页面data前 __phoneCallTriggered: None
# 设置页面data后,mock定义前 __phoneCallTriggered: False
# mock定义后,还没触发,拨号前 __phoneCallTriggered: False
# 点击拨号按钮
# 拨号后,mock触发 __phoneCallTriggered: True

问题二已成功解决,完美撒花~~~

No Reply at the moment.
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up