Minium Boot 1.0.2 | GitLocker.com Product

MiniumBoot 1.0.2

Last updated:

0 purchases

MiniumBoot 1.0.2 Image
MiniumBoot 1.0.2 Images

Free

Languages

Categories

Add to Cart

Description:

MiniumBoot 1.0.2

GitHub | Gitee
MiniumBoot - yaml驱动Minium测试
概述
Minium是微信小程序的自动化测试工具,但是要写python代码;
考虑到部分测试伙伴python能力不足,因此扩展Minium,支持通过yaml配置测试步骤;
框架通过编写简单的yaml, 就可以执行一系列复杂的微信小程序操作步骤, 如点击/输入/移动/上下滑/左右滑/放大缩小/提取变量/打印变量等,极大的简化了伙伴编写自动化测试脚本的工作量与工作难度,大幅提高人效;
框架通过提供类似pythonfor/if/break语义的步骤动作,赋予伙伴极大的开发能力与灵活性,能适用于广泛的测试场景。
框架提供include机制,用来加载并执行其他的步骤yaml,一方面是功能解耦,方便分工,一方面是功能复用,提高效率与质量,从而推进测试整体的工程化。
特性

基于 Minium 1.2.8, Minium要求使用python3.8以上;
支持通过yaml来配置执行的步骤,简化了自动化测试开发:
每个步骤可以有多个动作,但单个步骤中动作名不能相同(yaml语法要求);
动作代表小程序上的一种操作,如tap/swipe/scoll等等;
支持复杂的手势: 移动/上下滑/左右滑/放大缩小/多个点组成的移动轨迹等;
支持提取器
支持校验器
支持类似pythonfor/if/break语义的步骤动作,灵活适应各种场景
支持include引用其他的yaml配置文件,以便解耦与复用

todo

支持更多的动作

安装

安装 minium

pip3 install https://minitest.weixin.qq.com/minium/Python/dist/minium-latest.zip


安装 MiniumBoot

pip3 install MiniumBoot

安装后会生成命令MiniumBoot;
注: 对于深度deepin-linux系统,生成的命令放在目录~/.local/bin,建议将该目录添加到环境变量PATH中,如
export PATH="$PATH:/home/shi/.local/bin"

使用


修改配置文件(yml)中的 init_driver 动作的参数, 如平台、项目路径、开发者工具cli路径等


使用


# 1 执行单个文件
MiniumBoot 步骤配置文件.yml

# 2 执行多个文件
MiniumBoot 步骤配置文件1.yml 步骤配置文件2.yml ...

# 3 执行单个目录, 即执行该目录下所有的yml文件
MiniumBoot 步骤配置目录

# 4 执行单个目录下的指定模式的文件
MiniumBoot 步骤配置目录/step-*.yml

步骤配置文件及demo
用于指定多个步骤, 示例见源码 example 目录下的文件;
顶级的元素是步骤;
每个步骤里有多个动作(如sleep),如果动作有重名,就另外新开一个步骤写动作,这是由yaml语法限制导致的,但不影响步骤执行。
demo
demo视频
查找元素的方法
参考Page.get_element()

id: 根据 name 属性值来查找
css: 根据 css selector 来查找
xpath: 根据 xpath 来查找

配置详解
支持通过yaml来配置执行的步骤;
每个步骤可以有多个动作,但单个步骤中动作名不能相同(yaml语法要求);
动作代表 Minium 上的一种操作,如tap/swipe/scoll等等;
下面详细介绍每个动作:

init_driver: 初始化driver, 必须定义在第一个步骤中的第一个动作

# 初始化driver
- init_driver:
debug_mode: debug
enable_app_log: true
# windows cli: F:\微信web开发者工具\cli.bat auto --project "F:\project\jym_wechat" --auto-port 9420
project_path: F:\project\jym_wechat
dev_tool_path: F:\微信web开发者工具\cli.bat
app: wx
close_ide: false
test_port: 9420
assert_capture: true
use_push: true
auto_relaunch: true
request_timeout: 60
remote_connect_timeout: 300
# account_info:
# wx_nick_name: locker
# open_id: o6zAJs_pwr**********aROZDjiw
platform: ide # 小程序运行的平台,可选值为:ide, Android, IOS
# 当 platform = Android 时
# device_desire:
# serial: f978cc97 # Android设备号 adb devices查看
# uiautomator: UiAutomator2
# 当 platform = IOS 时
# device_desire:
# wda_project_path: /Users/sherlock/.npm-global/lib/node_modules/appium/node_modules/appium-webdriveragent
# os_type: ios
# device_info:
# udid: aee531018e668ff1aad*************2924e8
# model: iPhone 6
# version: 12.2.5
# name: sherlock's iPhone


close_driver: 关闭driver

close_driver:


sleep: 线程睡眠;

sleep: 2 # 线程睡眠2秒


print: 打印, 支持输出变量/函数;

# 调试打印
print: "总申请数=${dyn_data.total_apply}, 剩余份数=${dyn_data.quantity_remain}"

变量格式:
$msg 一级变量, 以$为前缀
${data.msg} 多级变量, 用 ${ 与 } 包含

函数格式:
${random_str(6)} 支持调用函数,目前仅支持以下几个函数: random_str/random_int/random_element/incr

函数罗列:
random_str(n): 随机字符串,参数n是字符个数
random_int(n): 随机数字,参数n是数字个数
random_element(var): 从list中随机挑选一个元素,参数var是list类型的变量名
incr(key): 自增值,从1开始,参数key表示不同的自增值,不同key会独立自增


input_by_id: 填充 id 指定的输入框;

input_by_id:
# 输入框id: 填充的值(支持写变量)
'name': '18877310999'


input_by_css: 填充 css selector 指定的输入框;

input_by_css:
# 输入框css selector模式: 填充的值(支持写变量)
'#account': '18877310999'


input_by_xpath: 填充 xpath 指定的输入框;

input_by_xpath:
# 输入框xpath路径: 填充的值(支持写变量)
"//input[@id='account']": '18877310999'


hide_keyboard: 隐藏键盘

hide_keyboard:


page_scroll: 滚动页面(传y坐标/位置在屏幕中比例)

# 滚动到绝对位置
page_scroll: 200 # y坐标, 单位px
page_scroll: 20% # 位置在屏幕中比例
# 滚动到相对位置:相对于上一次位置的相对位移
page_scroll: +200 # y位移
page_scroll: -20% # 位移在屏幕中比例


page_scroll_top: 滚动到页面顶部

page_scroll_top:


page_scroll_bottom: 滚动到页面底部

page_scroll_bottom:


scroll_by: 滚动某元素(传元素+坐标), 注意在基础库v2.23.4版本后支持

scroll_by:
# 元素查找方式(id/css/xpath多选一) : 查找的值
#id: line
xpath: //view[@id='line']
# 移动的位置/位移
pos: 100,200 # 绝对位置(坐标)
pos: +100,-200 # 相对位移
pos: +30%,50% # 元素高度的比例


scroll_up_by: 向上滚动元素, 注意在基础库v2.23.4版本后支持

scroll_up_by:
# 元素查找方式(id/css/xpath多选一) : 查找的值
#id: line
xpath: //view[@id='line']


scroll_down_by: 向下滚动元素, 注意在基础库v2.23.4版本后支持

scroll_down_by:
# 元素查找方式(id/css/xpath多选一) : 查找的值
#id: line
xpath: //view[@id='line']


scroll_left_by: 向左滚动元素, 注意在基础库v2.23.4版本后支持

scroll_left_by:
# 元素查找方式(id/css/xpath多选一) : 查找的值
#id: line
xpath: //view[@id='line']


scroll_right_by: 向右滚动元素, 注意在基础库v2.23.4版本后支持

scroll_right_by:
# 元素查找方式(id/css/xpath多选一) : 查找的值
#id: line
xpath: //view[@id='line']


swiper_by: 切换 swiper 容器当前的页面

swiper_by:
# 元素查找方式(id/css/xpath多选一) : 查找的值
#id: line
xpath: //view[@id='line']
# 页面序号, 从0开始
index: 2


long_press_by: 长按某元素

long_press_by:
# 元素查找方式(id/css/xpath多选一) : 查找的值
#id: line
xpath: //view[@id='line']


tap: 敲击屏幕(传坐标)

tap: 200,200


tap_by: 敲击元素

tap_by:
# 元素查找方式(id/css/xpath多选一) : 查找的值
xpath: //view[@id='btn']
# 耗时秒数, 可省, 可用于模拟长按
duration: 10


click_by/click_by_if_exist: 点击元素;

click_by:
# 元素查找方式(id/css/xpath多选一) : 查找的值
xpath: //view[@id='btn']

如果点击之前要先判断元素是否存在,则换用 click_by_if_exist

allow: 处理授权弹窗-允许某权限

allow: login # 授权类型




授权类型
描述




authorize
处理授权确认弹框


login
处理微信登陆确认弹框


get_user_info
处理获取用户信息确认弹框


get_location
处理获取位置信息确认弹框


get_we_run_data
处理获取微信运动数据确认弹框


record
处理录音确认弹框


write_photos_album
处理保存相册确认弹框


camera
处理使用摄像头确认弹框


get_user_phone
处理获取用户手机号码确认弹框


send_subscribe_message
允许发送订阅消息


get_we_run_data
处理获取微信运动数据确认弹框




forbid: 处理授权弹窗-禁止某权限

forbid: login # 授权类型

授权类型, 参考上一节allow动作

handle_modal: 点击弹窗的按钮

handle_modal: # 按钮文本,可省,默认为"确定"
handle_modal: 确定
handle_modal: 取消


deactive: 使微信进入后台一段时间, 再切回前台

deactive:


set_orientation: 设置屏幕方向

set_orientation: true # 是否竖屏, 否则横屏


set_location: 设置地理位置

set_location: 49,123 # 纬度,经度


screenshot: 整个窗口截图存为png;

screenshot:
save_dir: downloads # 保存的目录,默认为 downloads
save_file: test.png # 保存的文件名,默认为:时间戳.png


call_wx_method: 调用微信函数, 返回值放到变量return_val

call_wx_method: scanCode


call_page_method: 调用页面函数, 返回值放到变量return_val

call_page_method: getTabBar


goto: 跳转到指定页面, 但是不能跳到 tabbar 页面

goto: /pages/home/index # 页面url


switch_tab: 跳转到 tabBar 页面, 并关闭其他所有非 tabBar 页面

switch_tab: /pages/home/index # 页面url
switch_tab: 1 # 页面序号, 从0开始


execute_js: 执行js;

execute_js: console.log('hello world')


back: 返回键;

back:


get_clipboard: 读剪切板内容;

get_clipboard: name # 参数为记录剪切板内容的变量名


set_clipboard: 写剪切板内容;

set_clipboard: hello world $name # 参数是写入内容,可带参数


push_file:推文件到手机上, 即写手机上文件;

push_file:
to: /storage/emulated/0/documents/test/a.txt # 写入的手机上的文件
from: a.txt # 写入内容的本地来源文件


pull_file:从手机中拉文件, 即读手机上的文件;

pull_file:
from: /storage/emulated/0/documents/test/a.txt # 读取的手机上的文件
to: a.txt # 写入的本地文件
print: $content


pull_down_refresh: 下拉刷新

pull_down_refresh:


vibrate: 震动

vibrate: true # 是否长震,否则短震


scan_code: 扫码

scan_code:


send_sms:发送短信;

send_sms:
phone: 13475556022
content: hello $name


print_system_info: 打印系统信息

print_system_info:


print_all_pages: 打印所有页面

print_all_pages:


print_current_page: 打印当前页面

print_current_page:


for: 循环;
for动作下包含一系列子步骤,表示循环执行这系列子步骤;变量for_i记录是第几次迭代(从1开始)

# 循环3次
for(3) :
# 每次迭代要执行的子步骤
- swipe_down:
sleep: 2

# 循环list类型的变量urls
for(urls) :
# 每次迭代要执行的子步骤
- swipe_down:
sleep: 2

# 无限循环,直到遇到跳出动作
# 有变量for_i记录是第几次迭代(从1开始)
for:
# 每次迭代要执行的子步骤
- break_if: for_i>2 # 满足条件则跳出循环
swipe_down:
sleep: 2


once: 只执行一次,等价于 for(1);
once 结合 moveon_if,可以模拟 python 的 if 语法效果

once:
# 每次迭代要执行的子步骤
- moveon_if: for_i<=2 # 满足条件则往下走,否则跳出循环
swipe_down:
sleep: 2


break_if: 满足条件则跳出循环;
只能定义在for/once循环的子步骤中

break_if: for_i>2 # 条件表达式,python语法


moveon_if: 满足条件则往下走,否则跳出循环;
只能定义在for/once循环的子步骤中

moveon_if: for_i<=2 # 条件表达式,python语法


moveon_if_exist_by: 如果检查元素存在 则往下走,否则跳出循环;
只能定义在for/once循环的子步骤中

moveon_if_exist_by:
id: button1


break_if_exist_by: 如果检查元素存在 则跳出循环,否则往下走;
只能定义在for/once循环的子步骤中

break_if_exist_by:
id: button1


include: 包含其他步骤文件,如记录公共的步骤,或记录配置数据(如用户名密码);

include: part-common.yml


set_vars: 设置变量;

set_vars:
name: shi
password: 123456
birthday: 5-27


print_vars: 打印所有变量;

print_vars:


base_url: 设置基础url

base_url: https://www.taobao.com/


get: 发get请求, 但无跳转;

get:
url: $dyn_data_url # url,支持写变量
extract_by_eval:
dyn_data: "json.loads(response.text[16:-1])" # 变量response是响应对象


post: 发post请求, 但无跳转;

post:
url: http://admin.jym1.com/store/add_store # url,支持写变量
is_ajax: true
data: # post的参数
# 参数名:参数值
store_name: teststore-${random_str(6)}
store_logo_url: '$img'


upload: 上传文件;

upload: # 上传文件/图片
url: http://admin.jym1.com/upload/common_upload_img/store_img
files: # 上传的多个文件
# 参数名:文件本地路径
file: /home/shi/fruit.jpeg
extract_by_jsonpath:
img: $.data.url


download: 下载文件;
变量download_file记录最新下载的单个文件

download:
url: https://img.alicdn.com/tfscom/TB1t84NPuL2gK0jSZPhXXahvXXa.jpg_q90.jpg
save_dir: downloads # 保存的目录,默认为 downloads
save_file: test.jpg # 保存的文件名,默认为url中最后一级的文件名


exec: 执行命令, 可用于执行 HttpBoot/SeleniumBoot/AppiumBoot/MiniumBoot 等命令,以便打通多端的用例流程

exec: ls
exec: SeleniumBoot test.yml

校验器
主要是为了校验页面或响应的内容, 根据不同场景有2种写法
1. 针对当前页面, 那么校验器作为普通动作来写
2. 针对 get/post/upload 有发送http请求的动作, 那么校验器在动作内作为普通属性来写

不同校验器适用于不同场景



校验器
当前页面场景
http请求场景




validate_by_id
Y
N


validate_by_css
Y
Y


validate_by_xpath
Y
Y


validate_by_jsonpath
N
Y




validate_by_id:
从当前页面中校验 id 对应的元素的值

validate_by_id:
"cat_demo_text": # 元素的id
'=': 'Hello world' # 校验符号或函数: 校验的值


validate_by_css:
从html响应中校验类名对应的元素的值

validate_by_css:
'#id': # 元素的css selector 模式
'>': 0 # 校验符号或函数: 校验的值, 即 id 元素的值>0
'#goods_title':
contains: 衬衫 # 即 title 元素的值包含'衬衫'


validate_by_xpath:
从当前页面或html响应中校验 xpath 路径对应的元素的值

validate_by_xpath:
"//view[@id='goods_id']": # 元素的xpath路径
'>': 0 # 校验符号或函数: 校验的值, 即 id 元素的值>0
"//view[@id='goods_title']":
contains: 衬衫 # 即 title 元素的值包含'衬衫'


validate_by_jsonpath:
从json响应中校验 多层属性 的值

validate_by_jsonpath:
'$.data.goods_id':
'>': 0 # 校验符号或函数: 校验的值, 即 id 元素的值>0
'$.data.goods_title':
contains: 衬衫 # 即 title 元素的值包含'衬衫'

校验符号或函数

=: 相同
>: 大于
<: 小于
>=: 大于等于
<=: 小于等于
contains: 包含子串
startswith: 以子串开头
endswith: 以子串结尾
regex_match: 正则匹配
exist: 元素存在
not_exist: 元素不存在

提取器
主要是为了从页面或响应中提取变量, 根据不同场景有2种写法
1. 针对当前页面, 那么提取器作为普通动作来写
2. 针对 get/post/upload 有发送http请求的动作, 那么提取器在动作内作为普通属性来写

不同校验器适用于不同场景



校验器
页面场景
http请求场景




extract_by_id
Y
N


extract_by_css
Y
Y


extract_by_xpath
Y
Y


extract_by_jsonpath
N
Y


extract_by_eval
Y
Y




extract_by_id:
从当前页面中解析 id 对应的元素的值

extract_by_id:
# 变量名: 元素id
goods_id: "cat_demo_text"


extract_by_css:
从当前页面或html响应中解析 css selector 模式指定的元素的值

extract_by_css:
# 变量名: css selector 模式
goods_id: #goods_id
url: image::attr(src) # 获得<image>的src属性


extract_by_xpath:
从当前页面或html响应中解析 xpath 路径指定的元素的值

extract_by_xpath:
# 变量名: xpath路径
goods_id: //view[@id='goods_id']
url: //image/@src # 获得<image>的src属性


extract_by_jsonpath:
从json响应中解析 多层属性 的值

extract_by_jsonpath:
# 变量名: json响应的多层属性
img: $.data.url


extract_by_eval:
使用 eval(表达式) 执行表达式, 并将执行结果记录到变量中

extract_by_eval:
# 变量名: 表达式(python语法)
dyn_data: "json.loads(response.text[16:-1])" # 变量response是响应对象

存疑的动作

注: 以下动作是用来触发滑动手势, 是根据minium官方api move()/touchstart()/touchmove()/touchend()封装的, 但我测试时发现移动失败, 因此这部分官方api应该是无效的, 等啥时候有效就可以启用


swipe: 屏幕横扫(传坐标)

swipe:
from: 100,100 # 起点坐标
to: 200,200 # 终点坐标
duration: 2 # 耗时秒数, 可省


swipe_up: 上滑(传比例)

swipe_up: 0.55 # 移动幅度比例(占屏幕高度的比例)
swipe_up: # 默认移动幅度比例为0.5


swipe_down: 下滑(传比例)

swipe_down: 0.55 # 移动幅度比例(占屏幕高度的比例)
swipe_down: # 默认移动幅度比例为0.5


swipe_left: 左滑(传y坐标)

swipe_left: 100 # y坐标
swipe_left: # 默认y坐标为中间


swipe_right: 右滑(传y坐标)

swipe_right: 100 # y坐标
swipe_right: # 默认y坐标为中间


swipe_vertical: 垂直方向(上下)滑动(传比例)

swipe_vertical: 0.2,0.7 # y轴起点/终点位置在屏幕的比例,如 0.2,0.7,即y轴上从屏幕0.2比例处滑到0.7比例处


swipe_horizontal: 水平方向(左右)滑动(传比例)

swipe_horizontal: 0.2,0.7 # x轴起点/终点位置在屏幕的比例,如 0.2,0.7,即x轴上从屏幕0.2比例处滑到0.7比例处


move_by: 移动某元素(pos传坐标序列);

move_by:
# 元素查找方式(id/css/xpath多选一) : 查找的值
#id: line
xpath: //movable-view[@id='line']
# 坐标序列,坐标之间使用;分割,如x1,y1;x2,y2
pos: '800,1600;100,1600;100,600;800,600;360,600;360,1100'


zoom_in: 放大页面

zoom_in:


zoom_out: 缩小页面

zoom_out:


zoom_in_by: 放大某元素

zoom_in_by:
# 元素查找方式(id/css/xpath多选一) : 查找的值
#id: line
xpath: //view[@id='line']


zoom_out_by: 缩小某元素

zoom_out_by:
# 元素查找方式(id/css/xpath多选一) : 查找的值
#id: line
xpath: //view[@id='line']

License:

For personal and professional use. You cannot resell or redistribute these repositories in their original state.

Files In This Product: (if this is empty don't purchase this product)

Customer Reviews

There are no reviews.