diff --git a/404.html b/404.html index a4e74e4..91d4b0b 100644 --- a/404.html +++ b/404.html @@ -8,7 +8,7 @@ - + @@ -16,7 +16,7 @@
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.
- + \ No newline at end of file diff --git a/assets/app.CdLWD2ky.js b/assets/app.w4ajM7s2.js similarity index 95% rename from assets/app.CdLWD2ky.js rename to assets/app.w4ajM7s2.js index 3631c17..847a812 100644 --- a/assets/app.CdLWD2ky.js +++ b/assets/app.w4ajM7s2.js @@ -1 +1 @@ -import{R as i}from"./chunks/theme.15PVdnDQ.js";import{j as o,ag as u,ah as l,ai as c,aj as f,ak as d,al as m,am as h,an as g,ao as A,ap as v,d as w,u as y,l as C,z as P,aq as R,ar as b,as as j,a4 as D}from"./chunks/framework.CoRJFuj9.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=p(i),E=w({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&R(),b(),j(),s.setup&&s.setup(),()=>D(s.Layout)}});async function S(){const e=x(),a=T();a.provide(l,e);const t=c(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function T(){return g(E)}function x(){let e=o,a;return A(t=>{let n=v(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&S().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{S as createApp}; +import{R as i}from"./chunks/theme.D89Al4wk.js";import{j as o,ag as u,ah as l,ai as c,aj as f,ak as d,al as m,am as h,an as g,ao as A,ap as v,d as w,u as y,l as C,z as P,aq as R,ar as b,as as j,a4 as D}from"./chunks/framework.CoRJFuj9.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=p(i),E=w({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&R(),b(),j(),s.setup&&s.setup(),()=>D(s.Layout)}});async function S(){const e=x(),a=T();a.provide(l,e);const t=c(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function T(){return g(E)}function x(){let e=o,a;return A(t=>{let n=v(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&S().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{S as createApp}; diff --git a/assets/chunks/@localSearchIndexroot.TVYJnTv-.js b/assets/chunks/@localSearchIndexroot.TVYJnTv-.js deleted file mode 100644 index 42a1b57..0000000 --- a/assets/chunks/@localSearchIndexroot.TVYJnTv-.js +++ /dev/null @@ -1 +0,0 @@ -const t='{"documentCount":138,"nextId":138,"documentIds":{"0":"/youqu3/指南/与生俱来/JSON报告.html#json-报告","1":"/youqu3/指南/与生俱来/JSON报告.html#报告内容","2":"/youqu3/指南/与生俱来/JSON报告.html#整体结构","3":"/youqu3/指南/与生俱来/JSON报告.html#environment","4":"/youqu3/指南/与生俱来/JSON报告.html#summary","5":"/youqu3/指南/与生俱来/JSON报告.html#collectors","6":"/youqu3/指南/与生俱来/JSON报告.html#tests","7":"/youqu3/指南/与生俱来/JSON报告.html#warnings","8":"/youqu3/指南/与生俱来/全自动日志.html#全自动日志","9":"/youqu3/指南/与生俱来/全自动日志.html#背景","10":"/youqu3/指南/与生俱来/全自动日志.html#实现原理","11":"/youqu3/指南/与生俱来/全自动日志.html#日志配置","12":"/youqu3/指南/与生俱来/全自动日志.html#使用方法","13":"/youqu3/指南/与生俱来/前后钩子.html#前后钩子","14":"/youqu3/指南/与生俱来/前后钩子.html#前置钩子","15":"/youqu3/指南/与生俱来/前后钩子.html#前置脚本钩子","16":"/youqu3/指南/与生俱来/前后钩子.html#前置命令行入参钩子","17":"/youqu3/指南/与生俱来/前后钩子.html#后置钩子","18":"/youqu3/指南/与生俱来/前后钩子.html#后置脚本钩子","19":"/youqu3/指南/与生俱来/前后钩子.html#后置命令行入参钩子","20":"/youqu3/指南/与生俱来/动态等待.html#动态等待","21":"/youqu3/指南/与生俱来/动态等待.html#架构动态等待","22":"/youqu3/指南/与生俱来/动态等待.html#元素识别动态等待","23":"/youqu3/指南/与生俱来/命令行交互.html#命令行交互","24":"/youqu3/指南/与生俱来/命令行交互.html#本机命令行交互","25":"/youqu3/指南/与生俱来/命令行交互.html#普通权限执行","26":"/youqu3/指南/与生俱来/命令行交互.html#sudo权限执行","27":"/youqu3/指南/与生俱来/命令行交互.html#expect交互","28":"/youqu3/指南/与生俱来/命令行交互.html#远程命令行交互","29":"/youqu3/指南/与生俱来/命令行交互.html#普通权限执行-1","30":"/youqu3/指南/与生俱来/命令行交互.html#sudo权限执行-1","31":"/youqu3/指南/与生俱来/命令行交互.html#expect交互-1","32":"/youqu3/指南/与生俱来/断言语句.html#断言语句","33":"/youqu3/指南/与生俱来/断言语句.html#用例中使用方法","34":"/youqu3/指南/与生俱来/断言语句.html#方法明细","35":"/youqu3/指南/与生俱来/标签化管理.html#标签化管理","36":"/youqu3/指南/与生俱来/标签化管理.html#使用说明","37":"/youqu3/指南/与生俱来/标签化管理.html#csv文件与脚本对应关系","38":"/youqu3/指南/与生俱来/标签化管理.html#跳过用例","39":"/youqu3/指南/与生俱来/标签化管理.html#_1-固定跳过","40":"/youqu3/指南/与生俱来/标签化管理.html#_2-条件判断跳过","41":"/youqu3/指南/与生俱来/标签化管理.html#_3-自定义跳过","42":"/youqu3/指南/与生俱来/标签化管理.html#确认修复","43":"/youqu3/指南/与生俱来/标签化管理.html#废弃用例","44":"/youqu3/指南/与生俱来/标签化管理.html#文件格式","45":"/youqu3/指南/与生俱来/远程交互控制.html#远程交互式控制","46":"/youqu3/指南/与生俱来/远程交互控制.html#slaves对象提供远程机器信息","47":"/youqu3/指南/与生俱来/远程交互控制.html#ui操作远程对象","48":"/youqu3/指南/与生俱来/远程交互控制.html#rpcgui","49":"/youqu3/指南/环境管理/原生环境.html#原生环境","50":"/youqu3/指南/环境管理/虚拟环境.html#虚拟环境","51":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-cargo","52":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-shell","53":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-rm","54":"/youqu3/指南/简介/YouQu3是什么.html#youqu3-能做什么","55":"/youqu3/指南/简介/快速开始.html#快速开始","56":"/youqu3/指南/简介/快速开始.html#安装","57":"/youqu3/指南/简介/快速开始.html#创建用例工程","58":"/youqu3/指南/驱动执行/本地执行.html#本地执行","59":"/youqu3/指南/驱动执行/本地执行.html#子命令","60":"/youqu3/指南/驱动执行/本地执行.html#用例驱动方式","61":"/youqu3/指南/驱动执行/本地执行.html#执行所有用例","62":"/youqu3/指南/驱动执行/本地执行.html#指定执行某一个用例","63":"/youqu3/指南/驱动执行/本地执行.html#指定某个目录执行","64":"/youqu3/指南/驱动执行/本地执行.html#根据关键词执行","65":"/youqu3/指南/驱动执行/本地执行.html#根据标签执行","66":"/youqu3/指南/驱动执行/本地执行.html#批量用例id驱动执行","67":"/youqu3/指南/驱动执行/本地执行.html#指定用例文件路径执行","68":"/youqu3/指南/驱动执行/自定义执行.html#自定义执行","69":"/youqu3/指南/驱动执行/自定义执行.html#youqu-tags-txt","70":"/youqu3/指南/驱动执行/自定义执行.html#youqu-keywords-txt","71":"/youqu3/指南/驱动执行/远程执行.html#远程执行","72":"/youqu3/指南/驱动执行/远程执行.html#子命令","73":"/youqu3/指南/驱动执行/远程执行.html#远程测试机分组策略","74":"/youqu3/指南/驱动执行/远程执行.html#分组规则","75":"/youqu3/指南/驱动执行/远程执行.html#执行策略","76":"/youqu3/插件/OCR识别.html#pdocr-rpc","77":"/youqu3/插件/OCR识别.html#_1、服务端","78":"/youqu3/插件/OCR识别.html#服务端安装","79":"/youqu3/插件/OCR识别.html#服务端启动服务","80":"/youqu3/插件/OCR识别.html#_2、客户端","81":"/youqu3/插件/OCR识别.html#客户端安装","82":"/youqu3/插件/OCR识别.html#客户端使用","83":"/youqu3/插件/OCR识别.html#_2-1、识别当前屏幕的所有文字内容","84":"/youqu3/插件/OCR识别.html#_2-2、指定某张图片识别的所有文字内容","85":"/youqu3/插件/OCR识别.html#_2-3、在全屏指定查找某个字符串的坐标","86":"/youqu3/插件/OCR识别.html#_2-4、指定某张图片查找某个字符串的坐标","87":"/youqu3/插件/OCR识别.html#_2-5、其他参数","88":"/youqu3/插件/全自动日志.html#funnylog","89":"/youqu3/插件/全自动日志.html#安装","90":"/youqu3/插件/全自动日志.html#使用方法","91":"/youqu3/插件/全自动日志.html#_1、自动输出日志","92":"/youqu3/插件/全自动日志.html#_2、方法中输出其他的日志","93":"/youqu3/插件/全自动日志.html#_3、在外层其他直接使用","94":"/youqu3/插件/全自动日志.html#必要配置项","95":"/youqu3/插件/插件列表.html#youqu3-插件汇总信息","96":"/youqu3/规划/UOS自动化测试方法套件.html#uos-自动化测试方法套件-umtk","97":"/youqu3/规划/UOS自动化测试方法套件.html#_1-简介","98":"/youqu3/规划/UOS自动化测试方法套件.html#_2-工程设计","99":"/youqu3/规划/UOS自动化测试方法套件.html#_2-1-工程结构","100":"/youqu3/规划/UOS自动化测试方法套件.html#_2-2-方案说明","101":"/youqu3/规划/UOS自动化测试方法套件.html#_3-套件发布","102":"/youqu3/规划/UOS自动化测试方法套件.html#_4-套件维护","103":"/youqu3/规划/UOS自动化测试方法套件.html#_5-对套件的测试","104":"/youqu3/规划/UOS自动化测试方法套件.html#_6-umtk-和-youqu2-的公共方法库-public-有何区别","105":"/youqu3/规划/UOS自动化测试用例.html#uos-自动化测试用例","106":"/youqu3/规划/UOS自动化测试用例.html#_1-简介","107":"/youqu3/规划/UOS自动化测试用例.html#_2-工程设计","108":"/youqu3/规划/UOS自动化测试用例.html#_2-1-工程结构","109":"/youqu3/规划/UOS自动化测试用例.html#_2-2-方案说明","110":"/youqu3/规划/YouQu3架构设计规划.html#youqu3-架构设计规划","111":"/youqu3/规划/YouQu3架构设计规划.html#_1-背景","112":"/youqu3/规划/YouQu3架构设计规划.html#_2-目标","113":"/youqu3/规划/YouQu3架构设计规划.html#_3-架构设计","114":"/youqu3/规划/YouQu3架构设计规划.html#_3-1-总体方案","115":"/youqu3/规划/YouQu3架构设计规划.html#_3-2-架构设计","116":"/youqu3/规划/YouQu3架构设计规划.html#_3-3-整体数据流","117":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-详细设计","118":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-1-驱动执行管理","119":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-2-配置项管理","120":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-3-框架总线接口","121":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-4-按测试类型管理插件","122":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-5-环境依赖管理","123":"/youqu3/规划/YouQu3架构设计规划.html#_4-用例工程设计","124":"/youqu3/规划/YouQu3架构设计规划.html#_4-1-用例工程结构","125":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-各模块编写思路","126":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-1-方法层","127":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-2-用例层","128":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-3-断言","129":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-4-配置对象","130":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-5-用例标签管理文件","131":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-6-默认环境变量管理文件","132":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-7-依赖管理文件","133":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-8-调试用例驱动","134":"/youqu3/规划/YouQu3架构设计规划.html#_5-演进规划","135":"/youqu3/规划/YouQu3架构设计规划.html#可视化配置","136":"/youqu3/规划/YouQu3架构设计规划.html#非开发者下运行","137":"/youqu3/规划/YouQu3架构设计规划.html#过程钩子"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,8],"1":[1,2,1],"2":[1,3,23],"3":[1,3,31],"4":[1,3,15],"5":[1,3,4],"6":[1,3,21],"7":[1,3,23],"8":[1,1,1],"9":[1,1,41],"10":[1,1,24],"11":[1,1,27],"12":[1,1,102],"13":[1,1,3],"14":[1,1,1],"15":[1,2,11],"16":[1,2,24],"17":[1,1,1],"18":[1,2,12],"19":[1,2,24],"20":[1,1,1],"21":[1,1,21],"22":[1,1,1],"23":[1,1,1],"24":[1,1,1],"25":[1,2,8],"26":[1,2,11],"27":[1,2,18],"28":[1,1,1],"29":[1,2,13],"30":[1,2,15],"31":[1,2,17],"32":[1,1,4],"33":[1,1,35],"34":[1,1,255],"35":[1,1,1],"36":[1,1,13],"37":[1,1,50],"38":[1,1,14],"39":[2,2,18],"40":[2,2,62],"41":[2,2,41],"42":[1,1,33],"43":[1,1,21],"44":[1,1,8],"45":[1,1,13],"46":[1,1,21],"47":[1,1,1],"48":[1,2,57],"49":[1,1,11],"50":[1,1,22],"51":[2,1,6],"52":[2,1,12],"53":[2,1,4],"54":[3,1,18],"55":[1,1,1],"56":[1,1,19],"57":[1,1,9],"58":[1,1,1],"59":[1,1,7],"60":[1,1,1],"61":[1,2,6],"62":[1,2,21],"63":[1,2,25],"64":[1,2,30],"65":[1,2,24],"66":[1,2,15],"67":[1,2,21],"68":[1,1,8],"69":[3,1,14],"70":[3,1,1],"71":[1,1,1],"72":[1,1,19],"73":[1,1,1],"74":[1,2,17],"75":[1,2,32],"76":[2,1,18],"77":[2,2,1],"78":[1,4,6],"79":[1,4,22],"80":[2,2,1],"81":[1,4,5],"82":[1,4,1],"83":[3,5,21],"84":[2,5,11],"85":[3,5,8],"86":[3,5,10],"87":[3,5,39],"88":[1,1,12],"89":[1,1,4],"90":[1,1,1],"91":[2,2,61],"92":[2,2,58],"93":[2,2,49],"94":[1,1,37],"95":[2,1,90],"96":[4,1,1],"97":[2,4,18],"98":[2,4,1],"99":[3,5,20],"100":[2,5,21],"101":[2,4,33],"102":[2,4,8],"103":[2,4,9],"104":[7,4,50],"105":[2,1,1],"106":[2,2,12],"107":[2,2,1],"108":[3,4,29],"109":[2,4,24],"110":[2,1,1],"111":[2,2,56],"112":[2,2,46],"113":[2,2,1],"114":[3,4,37],"115":[3,4,1],"116":[2,4,15],"117":[3,4,2],"118":[4,6,16],"119":[4,6,19],"120":[3,6,12],"121":[3,6,4],"122":[4,6,5],"123":[2,2,5],"124":[3,4,49],"125":[3,4,2],"126":[4,6,53],"127":[3,6,32],"128":[4,6,30],"129":[3,6,13],"130":[4,6,9],"131":[4,6,4],"132":[4,6,2],"133":[4,6,5],"134":[2,2,1],"135":[1,7,6],"136":[1,7,4],"137":[1,7,5]},"averageFieldLength":[1.7536231884057978,2.5434782608695654,18.95652173913044],"storedFields":{"0":{"title":"JSON 报告","titles":[]},"1":{"title":"报告内容","titles":["JSON 报告"]},"2":{"title":"整体结构","titles":["JSON 报告","报告内容"]},"3":{"title":"Environment","titles":["JSON 报告","报告内容"]},"4":{"title":"Summary","titles":["JSON 报告","报告内容"]},"5":{"title":"Collectors","titles":["JSON 报告","报告内容"]},"6":{"title":"Tests","titles":["JSON 报告","报告内容"]},"7":{"title":"Warnings","titles":["JSON 报告","报告内容"]},"8":{"title":"全自动日志","titles":[]},"9":{"title":"背景","titles":["全自动日志"]},"10":{"title":"实现原理","titles":["全自动日志"]},"11":{"title":"日志配置","titles":["全自动日志"]},"12":{"title":"使用方法","titles":["全自动日志"]},"13":{"title":"前后钩子","titles":[]},"14":{"title":"前置钩子","titles":["前后钩子"]},"15":{"title":"前置脚本钩子","titles":["前后钩子","前置钩子"]},"16":{"title":"前置命令行入参钩子","titles":["前后钩子","前置钩子"]},"17":{"title":"后置钩子","titles":["前后钩子"]},"18":{"title":"后置脚本钩子","titles":["前后钩子","后置钩子"]},"19":{"title":"后置命令行入参钩子","titles":["前后钩子","后置钩子"]},"20":{"title":"动态等待","titles":[]},"21":{"title":"架构动态等待","titles":["动态等待"]},"22":{"title":"元素识别动态等待","titles":["动态等待"]},"23":{"title":"命令行交互","titles":[]},"24":{"title":"本机命令行交互","titles":["命令行交互"]},"25":{"title":"普通权限执行","titles":["命令行交互","本机命令行交互"]},"26":{"title":"sudo权限执行","titles":["命令行交互","本机命令行交互"]},"27":{"title":"expect交互","titles":["命令行交互","本机命令行交互"]},"28":{"title":"远程命令行交互","titles":["命令行交互"]},"29":{"title":"普通权限执行","titles":["命令行交互","远程命令行交互"]},"30":{"title":"sudo权限执行","titles":["命令行交互","远程命令行交互"]},"31":{"title":"expect交互","titles":["命令行交互","远程命令行交互"]},"32":{"title":"断言语句","titles":[]},"33":{"title":"用例中使用方法","titles":["断言语句"]},"34":{"title":"方法明细","titles":["断言语句"]},"35":{"title":"标签化管理","titles":[]},"36":{"title":"使用说明","titles":["标签化管理"]},"37":{"title":"CSV文件与脚本对应关系","titles":["标签化管理"]},"38":{"title":"跳过用例","titles":["标签化管理"]},"39":{"title":"1. 固定跳过","titles":["标签化管理","跳过用例"]},"40":{"title":"2. 条件判断跳过","titles":["标签化管理","跳过用例"]},"41":{"title":"3.自定义跳过","titles":["标签化管理","跳过用例"]},"42":{"title":"确认修复","titles":["标签化管理"]},"43":{"title":"废弃用例","titles":["标签化管理"]},"44":{"title":"文件格式","titles":["标签化管理"]},"45":{"title":"远程交互式控制","titles":[]},"46":{"title":"slaves对象提供远程机器信息","titles":["远程交互式控制"]},"47":{"title":"UI操作远程对象","titles":["远程交互式控制"]},"48":{"title":"RpcGui","titles":["远程交互式控制","UI操作远程对象"]},"49":{"title":"原生环境","titles":[]},"50":{"title":"虚拟环境","titles":[]},"51":{"title":"youqu3-cargo","titles":["虚拟环境"]},"52":{"title":"youqu3-shell","titles":["虚拟环境"]},"53":{"title":"youqu3-rm","titles":["虚拟环境"]},"54":{"title":"YouQu3 能做什么?","titles":[null]},"55":{"title":"快速开始","titles":[]},"56":{"title":"安装","titles":["快速开始"]},"57":{"title":"创建用例工程","titles":["快速开始"]},"58":{"title":"本地执行","titles":[]},"59":{"title":"子命令","titles":["本地执行"]},"60":{"title":"用例驱动方式","titles":["本地执行"]},"61":{"title":"执行所有用例","titles":["本地执行","用例驱动方式"]},"62":{"title":"指定执行某一个用例","titles":["本地执行","用例驱动方式"]},"63":{"title":"指定某个目录执行","titles":["本地执行","用例驱动方式"]},"64":{"title":"根据关键词执行","titles":["本地执行","用例驱动方式"]},"65":{"title":"根据标签执行","titles":["本地执行","用例驱动方式"]},"66":{"title":"批量用例ID驱动执行","titles":["本地执行","用例驱动方式"]},"67":{"title":"指定用例文件路径执行","titles":["本地执行","用例驱动方式"]},"68":{"title":"自定义执行","titles":[]},"69":{"title":"youqu-tags.txt","titles":["自定义执行"]},"70":{"title":"youqu-keywords.txt","titles":["自定义执行"]},"71":{"title":"远程执行","titles":[]},"72":{"title":"子命令","titles":["远程执行"]},"73":{"title":"远程测试机分组策略","titles":["远程执行"]},"74":{"title":"分组规则","titles":["远程执行","远程测试机分组策略"]},"75":{"title":"执行策略","titles":["远程执行","远程测试机分组策略"]},"76":{"title":"pdocr-rpc","titles":[]},"77":{"title":"1、服务端","titles":["pdocr-rpc"]},"78":{"title":"服务端安装","titles":["pdocr-rpc","1、服务端"]},"79":{"title":"服务端启动服务","titles":["pdocr-rpc","1、服务端"]},"80":{"title":"2、客户端","titles":["pdocr-rpc"]},"81":{"title":"客户端安装","titles":["pdocr-rpc","2、客户端"]},"82":{"title":"客户端使用","titles":["pdocr-rpc","2、客户端"]},"83":{"title":"2.1、识别当前屏幕的所有文字内容","titles":["pdocr-rpc","2、客户端","客户端使用"]},"84":{"title":"2.2、指定某张图片识别的所有文字内容","titles":["pdocr-rpc","2、客户端","客户端使用"]},"85":{"title":"2.3、在全屏指定查找某个字符串的坐标","titles":["pdocr-rpc","2、客户端","客户端使用"]},"86":{"title":"2.4、指定某张图片查找某个字符串的坐标","titles":["pdocr-rpc","2、客户端","客户端使用"]},"87":{"title":"2.5、其他参数","titles":["pdocr-rpc","2、客户端","客户端使用"]},"88":{"title":"FunnyLog","titles":[]},"89":{"title":"安装","titles":["FunnyLog"]},"90":{"title":"使用方法","titles":["FunnyLog"]},"91":{"title":"1、自动输出日志","titles":["FunnyLog","使用方法"]},"92":{"title":"2、方法中输出其他的日志","titles":["FunnyLog","使用方法"]},"93":{"title":"3、在外层其他直接使用","titles":["FunnyLog","使用方法"]},"94":{"title":"必要配置项","titles":["FunnyLog"]},"95":{"title":"YouQu3 插件汇总信息","titles":[null]},"96":{"title":"UOS 自动化测试方法套件(UMTK)","titles":[]},"97":{"title":"1. 简介","titles":["UOS 自动化测试方法套件(UMTK)"]},"98":{"title":"2. 工程设计","titles":["UOS 自动化测试方法套件(UMTK)"]},"99":{"title":"2.1. 工程结构","titles":["UOS 自动化测试方法套件(UMTK)","2. 工程设计"]},"100":{"title":"2.2. 方案说明","titles":["UOS 自动化测试方法套件(UMTK)","2. 工程设计"]},"101":{"title":"3. 套件发布","titles":["UOS 自动化测试方法套件(UMTK)"]},"102":{"title":"4. 套件维护","titles":["UOS 自动化测试方法套件(UMTK)"]},"103":{"title":"5. 对套件的测试","titles":["UOS 自动化测试方法套件(UMTK)"]},"104":{"title":"6. UMTK 和 YouQu2 的公共方法库(public)有何区别","titles":["UOS 自动化测试方法套件(UMTK)"]},"105":{"title":"UOS 自动化测试用例","titles":[]},"106":{"title":"1. 简介","titles":["UOS 自动化测试用例"]},"107":{"title":"2. 工程设计","titles":["UOS 自动化测试用例"]},"108":{"title":"2.1. 工程结构","titles":["UOS 自动化测试用例","2. 工程设计"]},"109":{"title":"2.2. 方案说明","titles":["UOS 自动化测试用例","2. 工程设计"]},"110":{"title":"YouQu3 架构设计规划","titles":[]},"111":{"title":"1. 背景","titles":["YouQu3 架构设计规划"]},"112":{"title":"2. 目标","titles":["YouQu3 架构设计规划"]},"113":{"title":"3. 架构设计","titles":["YouQu3 架构设计规划"]},"114":{"title":"3.1. 总体方案","titles":["YouQu3 架构设计规划","3. 架构设计"]},"115":{"title":"3.2. 架构设计","titles":["YouQu3 架构设计规划","3. 架构设计"]},"116":{"title":"3.3. 整体数据流","titles":["YouQu3 架构设计规划","3. 架构设计"]},"117":{"title":"3.4. 详细设计","titles":["YouQu3 架构设计规划","3. 架构设计"]},"118":{"title":"3.4.1. 驱动执行管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"119":{"title":"3.4.2. 配置项管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"120":{"title":"3.4.3. 框架总线接口","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"121":{"title":"3.4.4. 按测试类型管理插件","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"122":{"title":"3.4.5. 环境依赖管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"123":{"title":"4. 用例工程设计","titles":["YouQu3 架构设计规划"]},"124":{"title":"4.1. 用例工程结构","titles":["YouQu3 架构设计规划","4. 用例工程设计"]},"125":{"title":"4.2. 各模块编写思路","titles":["YouQu3 架构设计规划","4. 用例工程设计"]},"126":{"title":"4.2.1. 方法层","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"127":{"title":"4.2.2. 用例层","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"128":{"title":"4.2.3. 断言","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"129":{"title":"4.2.4. 配置对象","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"130":{"title":"4.2.5. 用例标签管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"131":{"title":"4.2.6. 默认环境变量管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"132":{"title":"4.2.7. 依赖管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"133":{"title":"4.2.8. 调试用例驱动","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"134":{"title":"5. 演进规划","titles":["YouQu3 架构设计规划"]},"135":{"title":"可视化配置","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]},"136":{"title":"非开发者下运行","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]},"137":{"title":"过程钩子","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]}},"dirtCount":0,"index":[["即可自动被框架加载并执行",{"2":{"137":1}}],["即默认返回识别到字符串的中心坐标",{"2":{"87":1}}],["过程钩子",{"0":{"137":1}}],["过程中如果根据需要出小版本",{"2":{"101":1}}],["减少系统自动化环境准备的难度",{"2":{"136":1}}],["非开发者下运行",{"0":{"136":1}}],["配合远程执行功能",{"2":{"135":1}}],["配置对象",{"0":{"129":1}}],["配置模块",{"2":{"124":1}}],["配置文件管理配置项",{"2":{"119":1}}],["配置类",{"2":{"119":1,"129":1}}],["配置项管理",{"0":{"119":1},"2":{"119":1}}],["页面化的配置功能",{"2":{"135":1}}],["演进规划",{"0":{"134":1},"1":{"135":1,"136":1,"137":1}}],["模式运行脚本",{"2":{"133":1}}],["模块",{"2":{"118":1}}],["模块化改造",{"2":{"112":1}}],["模块名称为应用包名",{"2":{"100":1,"109":1}}],["模块名称",{"2":{"64":1}}],["定义用例工程所需要的依赖包",{"2":{"132":1}}],["定义虚拟环境相关的一些环境变量",{"2":{"131":1}}],["运行的行为",{"2":{"131":1}}],["运行稳定性",{"2":{"112":1}}],["日常维护过程中",{"2":{"130":1}}],["日志文件的生成路径",{"2":{"94":1}}],["日志",{"2":{"92":3}}],["日志模板语法",{"2":{"12":1}}],["日志配置",{"0":{"11":1}}],["维护标签时",{"2":{"130":1}}],["维护方法的稳定性有效性将成为一个问题",{"2":{"103":1}}],["然后",{"2":{"128":1}}],["然后将这些基础能力通过",{"2":{"45":1}}],["任务栏点击文件管理器",{"2":{"126":1}}],["\\t\\tself",{"2":{"128":1}}],["\\t",{"2":{"126":1}}],["\\tdef",{"2":{"126":1}}],["弹窗",{"2":{"126":1}}],["左边视图区域",{"2":{"126":1}}],["右边视图区域",{"2":{"126":1}}],["标题栏",{"2":{"126":1}}],["标签驱动",{"2":{"114":1}}],["标签驱动支持",{"2":{"65":1}}],["标签",{"2":{"65":1}}],["标签记录为",{"2":{"40":1}}],["标签可以无序",{"2":{"37":1}}],["标签化管理",{"0":{"35":1},"1":{"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1}}],["进行编写",{"2":{"126":1}}],["进行分割",{"2":{"41":1}}],["按照",{"2":{"126":1}}],["按测试类型管理插件",{"0":{"121":1}}],["放置在对应的类里面",{"2":{"126":1}}],["设计思想",{"2":{"126":1}}],["设计模式",{"2":{"100":1,"114":1}}],["依赖管理文件",{"0":{"132":1},"2":{"124":1}}],["调试用例驱动",{"0":{"133":1}}],["调试用例驱动脚本",{"2":{"124":1}}],["调用所有的断言语句",{"2":{"33":1}}],["调用方法时",{"2":{"12":1}}],["图像识别方法所需要的资源",{"2":{"124":1}}],["图片路径",{"2":{"34":2}}],["上层用例就能通过框架动态调用插件提供的功能",{"2":{"120":1}}],["插槽",{"2":{"120":1}}],["插件如果已经安装",{"2":{"120":1}}],["插件",{"2":{"116":1}}],["插件汇总信息",{"0":{"95":1}}],["原则上不通过修改配置文件的方式修改",{"2":{"119":1}}],["原生环境虚拟环境",{"2":{"59":1,"61":1,"62":2,"63":1,"64":1,"65":1,"66":1,"67":3,"72":1,"75":1}}],["原生环境",{"0":{"49":1}}],["公共配置为框架提供的一些具有默认值的配置项",{"2":{"119":1}}],["公共配置的形式",{"2":{"119":1}}],["显示的传入参数值",{"2":{"119":1}}],["采用虚拟环境管理依赖项",{"2":{"122":1}}],["采用命令行参数",{"2":{"119":1}}],["采用全新的架构设计",{"2":{"104":1}}],["解析测试策略",{"2":{"118":1}}],["解除跳过时将装饰器代码删掉",{"2":{"38":1}}],["获取命令行参数并结合配置项",{"2":{"118":1}}],["获取被装饰的类下所有函数",{"2":{"10":1}}],["驱动",{"2":{"118":1}}],["驱动命令将命令行参数传递给框架底层",{"2":{"118":1}}],["驱动执行管理",{"0":{"118":1}}],["驱动执行",{"2":{"63":1}}],["详细介绍各功能模块的设计和编写思路",{"2":{"125":1}}],["详细描述各模块工作方式",{"2":{"117":1}}],["详细设计",{"0":{"117":1},"1":{"118":1,"119":1,"120":1,"121":1,"122":1}}],["抛异常程序终止",{"2":{"116":1}}],["否则提示用户进行安装",{"2":{"116":1}}],["否则会提示无法连接",{"2":{"72":1}}],["底层功能",{"2":{"116":1}}],["让用户能专注于用例逻辑的编写和维护",{"2":{"114":1}}],["管理",{"2":{"114":1}}],["资源目录",{"2":{"114":1}}],["生成的用例工程遵循完整的",{"2":{"114":1}}],["三方包的形式提供",{"2":{"114":1}}],["由用例层决定使用哪些功能对应安装哪些插件",{"2":{"114":1}}],["由于虚拟环境中也安装了",{"2":{"52":1}}],["由于需求变更",{"2":{"43":1}}],["总体方案",{"0":{"114":1}}],["互不影响",{"2":{"112":1}}],["提高",{"2":{"112":1}}],["提高用例开发效率",{"2":{"112":1}}],["提供一个",{"2":{"135":1}}],["提供可调用的配置对象config",{"2":{"124":1}}],["提供的一个全局对象",{"2":{"46":1}}],["提供灵活的前后钩子机制",{"2":{"13":1}}],["安全性稳定性更好",{"2":{"112":1}}],["安装",{"0":{"56":1,"89":1},"2":{"101":1}}],["降低使用门槛",{"2":{"112":1}}],["价值",{"2":{"112":1}}],["简化系统环境部署",{"2":{"112":1}}],["简介",{"0":{"97":1,"106":1}}],["搭配远程执行功能",{"2":{"112":1}}],["功能插件可插拔",{"2":{"114":1}}],["功能扩展性更好",{"2":{"112":1}}],["功能可插拔",{"2":{"112":1}}],["功能强大的自动化测试框架",{"2":{"111":1}}],["功能强大的日志工具",{"2":{"88":1}}],["极致轻量化",{"2":{"112":1}}],["诸多亮点功能的同时解决其遇到的问题",{"2":{"112":1}}],["扩展性和兼容性更好的自动化测试框架",{"2":{"111":1}}],["更贴合大部分真实用户的使用场景",{"2":{"136":1}}],["更新",{"2":{"112":1}}],["更加纯粹",{"2":{"111":1}}],["更重要的是我们不想引入三方依赖",{"2":{"44":1}}],["甚至有些问题在现有框架结构下根本无法解决",{"2":{"111":1}}],["业务流程有一些影响",{"2":{"111":1}}],["业务不同",{"2":{"104":1}}],["势必对现有公司自动化用例",{"2":{"111":1}}],["等等",{"2":{"111":1}}],["绑定了太多公司的业务",{"2":{"111":1}}],["导致框架代码容易被用户修改",{"2":{"111":1}}],["源代码暴露在用户面前",{"2":{"111":1}}],["每次使用需要初始化框架工程及单独做环境部署",{"2":{"111":1}}],["每个应用存在一个唯一的出口文件",{"2":{"100":1}}],["每个机器执行",{"2":{"75":1}}],["每个模块建立一个",{"2":{"37":1}}],["每个用例的详细结果",{"2":{"6":1}}],["仍然存在一些不尽人意的地方",{"2":{"111":1}}],["小版本更新了数十个",{"2":{"111":1}}],["两个大版本",{"2":{"111":1}}],["两对大括号中的内容",{"2":{"12":1}}],["月在欧拉社区开源",{"2":{"111":1}}],["月正式在",{"2":{"111":1}}],["社区开源",{"2":{"111":1}}],["年",{"2":{"111":2}}],["年多的持续开发优化",{"2":{"111":1}}],["年成都测试团队开始内部孵化的项目",{"2":{"111":1}}],["经过了",{"2":{"111":1}}],["旨在成为下一代",{"2":{"112":1}}],["旨在开发一个简单易用",{"2":{"111":1}}],["旨在提供",{"2":{"106":1}}],["旨在提供系统预装应用所有的元素的操作方法",{"2":{"97":1}}],["做复杂步骤的封装",{"2":{"109":1}}],["里面导入使用",{"2":{"109":1}}],["里面的静态方法",{"2":{"91":2,"92":1}}],["里面的类方法",{"2":{"91":2}}],["里面的实例方法",{"2":{"91":2}}],["编写的",{"2":{"106":1}}],["大量人员都可以对其进行直接修改",{"2":{"104":1}}],["稳定性",{"2":{"104":2}}],["确保操作方法的一致性",{"2":{"104":1}}],["确认修复",{"0":{"42":1},"2":{"36":1,"37":1,"42":3,"43":1}}],["代码一致性",{"2":{"104":1}}],["代表不跳过",{"2":{"41":1}}],["代表跳过",{"2":{"41":1}}],["容易受到需求变更",{"2":{"104":1}}],["仅包含自动化用例用到的少部分公共方法",{"2":{"104":1}}],["仅驱动执行这一条用例",{"2":{"62":1}}],["涵盖了",{"2":{"104":1}}],["范围覆盖很少",{"2":{"104":1}}],["范围",{"2":{"104":1}}],["内外部开发者们的认可",{"2":{"111":1}}],["内容",{"2":{"104":1}}],["内置支持的条件跳过对象",{"2":{"40":1}}],["二者属于两个时代",{"2":{"104":1}}],["有些问题处理起来必然会影响到框架的兼容性",{"2":{"111":1}}],["有效性没有保障",{"2":{"104":1}}],["有效性",{"2":{"104":1}}],["有很大差异",{"2":{"104":1}}],["有何区别",{"0":{"104":1}}],["亦各从其志也",{"2":{"104":1}}],["道",{"2":{"104":1}}],["卫灵公",{"2":{"104":1}}],["论语",{"2":{"104":1}}],["孔子",{"2":{"104":1}}],["适合有离线部署需求的用户",{"2":{"112":1}}],["适配厂商可以直接使用这些单元测试进行适配测试",{"2":{"103":1}}],["适用于气泡类的断言",{"2":{"34":1}}],["专门针对元素操作方法函数进行测试",{"2":{"103":1}}],["对象的属性值",{"2":{"119":1}}],["对纯",{"2":{"111":1}}],["对套件的测试",{"0":{"103":1}}],["对于用例规模比较大的应用",{"2":{"37":1}}],["鼓励内外部开发者贡献",{"2":{"102":1}}],["发布",{"2":{"101":1}}],["发布一个套件版本",{"2":{"101":2}}],["阶段",{"2":{"101":1}}],["套件里面保存元素的操作方法",{"2":{"103":1}}],["套件由专人主责维护",{"2":{"102":1}}],["套件维护",{"0":{"102":1}}],["套件通过",{"2":{"101":1}}],["套件持续保持更新",{"2":{"101":1}}],["套件分大版本发布",{"2":{"101":1}}],["套件发布",{"0":{"101":1}}],["遵循",{"2":{"100":1}}],["供外部用例调用",{"2":{"100":1}}],["下划线连接单词",{"2":{"100":1,"109":1}}],["下完美的键鼠工具",{"2":{"95":1}}],["方便用例开发者以",{"2":{"133":1}}],["方便安装",{"2":{"112":1}}],["方案说明",{"0":{"100":1,"109":1}}],["方法唯一出口类",{"2":{"124":1}}],["方法基类",{"2":{"124":1}}],["方法层按需导入框架提供的底层能力",{"2":{"126":1}}],["方法层",{"0":{"126":1}}],["方法层目录",{"2":{"124":1}}],["方法层基础代码自动生成",{"2":{"114":1}}],["方法层所有的函数",{"2":{"12":1}}],["方法代码",{"2":{"114":1}}],["方法增删改的详细数据",{"2":{"95":1}}],["方法里面仍然可以单独打印日志",{"2":{"92":1}}],["方法中输出其他的日志",{"0":{"92":1}}],["方法只能有一个入参",{"2":{"41":1}}],["方法必须有返回结果并且为布尔值",{"2":{"41":1}}],["方法名必须以",{"2":{"41":1}}],["方法编写规范",{"2":{"41":1}}],["方法明细",{"0":{"34":1}}],["方法库里面",{"2":{"12":1}}],["方法",{"2":{"10":1}}],["└──",{"2":{"99":4,"108":5,"124":3}}],["工程结构",{"0":{"99":1,"108":1}}],["工程设计",{"0":{"98":1,"107":1},"1":{"99":1,"100":1,"108":1,"109":1}}],["工程自有断言模块",{"2":{"33":1}}],["组装成自动化测试用例",{"2":{"97":1}}],["测试方法套件中所有的方法均为原子操作",{"2":{"100":1}}],["测试方法套件是一个独立项目",{"2":{"97":1}}],["测试单驱动插件",{"2":{"95":1}}],["系统中各应用在",{"2":{"109":1}}],["系统中各应用划分自己的模块",{"2":{"100":1}}],["系统所有预装应用的测试用例",{"2":{"106":1}}],["系统所有预装应用的原子操作方法",{"2":{"104":1}}],["系统级测试用例",{"2":{"106":1}}],["系统自动化测试操作方法套件",{"2":{"97":1}}],["系统显示协议跳过",{"2":{"40":1}}],["全面插件化模块化",{"2":{"112":1}}],["全面优化框架接口调用机制",{"2":{"112":1}}],["全称",{"2":{"97":1}}],["全自动日志插件",{"2":{"95":1}}],["全自动日志",{"0":{"8":1},"1":{"9":1,"10":1,"11":1,"12":1}}],["将基于youqu2的用例代码修改为youqu3",{"2":{"95":1}}],["将跳过用例操作也整合进入用例标签",{"2":{"38":1}}],["迁移工具",{"2":{"95":1}}],["相对位移元素定位方案的配置文件",{"2":{"124":1}}],["相对位移定位插件",{"2":{"95":1}}],["相册的用例文件为",{"2":{"37":1}}],["操作系统环境支持不够友好",{"2":{"111":1}}],["操作系统预装应用的元素操作方法套件",{"2":{"97":1}}],["操作较为复杂",{"2":{"111":1}}],["操作或命令行操作",{"2":{"45":1}}],["操控插件",{"2":{"95":1}}],["键鼠操作插件",{"2":{"95":1}}],["✔️",{"2":{"95":14}}],["属性定位插件",{"2":{"95":1}}],["级别",{"2":{"94":1}}],["你可以配置为其他位置",{"2":{"94":1}}],["你可以使用它进行用例的驱动执行和管理",{"2":{"49":1}}],["必要配置项",{"0":{"94":1}}],["终端输出",{"2":{"91":1,"92":1,"93":1}}],["终端输出的日志级别",{"2":{"11":1}}],["直接调用基类里面的方法",{"2":{"91":1}}],["我是",{"2":{"91":6,"92":1}}],["我们可以将界面分为四个区域",{"2":{"126":1}}],["我们想要设计开发一个更加简单易用",{"2":{"111":1}}],["我们需要建立对套件的自动化测试",{"2":{"103":1}}],["我们设计出了",{"2":{"9":1}}],["我们发现",{"2":{"9":1}}],["其中所有的用例步骤都应该调用方法层对应的方法",{"2":{"127":1}}],["其中有一张图片识别成功即返回结果",{"2":{"34":1}}],["其他人可以提需求",{"2":{"102":1}}],["其他参数",{"0":{"87":1}}],["天天向上",{"2":{"85":2,"86":1}}],["天真",{"2":{"9":1}}],["客户端使用",{"0":{"82":1},"1":{"83":1,"84":1,"85":1,"86":1,"87":1}}],["客户端安装",{"0":{"81":1}}],["客户端",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1}}],["客户端提供了一个简单易用的函数",{"2":{"76":1}}],["写入以下内容",{"2":{"79":1}}],["名称你可以自定义",{"2":{"79":1}}],["随意新建一个py文件",{"2":{"79":1}}],["封装的",{"2":{"76":1,"97":1}}],["个机器瓜分",{"2":{"75":1}}],["个测试机",{"2":{"75":1}}],["个组",{"2":{"74":1}}],["都同时执行",{"2":{"75":1}}],["都不需要再写日志代码",{"2":{"12":1}}],["条",{"2":{"75":2}}],["条用例",{"2":{"75":2}}],["条件判断组合",{"2":{"41":1}}],["条件判断跳过",{"0":{"40":1}}],["假设总共",{"2":{"75":1}}],["同事们",{"2":{"111":1}}],["同样可以进行配置修改",{"2":{"94":1}}],["同一组内瓜分执行",{"2":{"75":1}}],["同时定义一些用例工程相关的配置",{"2":{"129":1}}],["同时框架可以在中间件中对插件功能进行增强或修改",{"2":{"120":1}}],["同时对各功能进行插件化",{"2":{"112":1}}],["同时选择多个环境",{"2":{"56":1}}],["同时标记了skip",{"2":{"42":1}}],["规则概述",{"2":{"75":1}}],["一键生成用例工程模板代码",{"2":{"114":1}}],["一些底层模块或接口命名不优雅",{"2":{"111":1}}],["一对大括号表示一个组",{"2":{"74":1}}],["一个元素一个方法",{"2":{"126":1}}],["一个页面一个类",{"2":{"126":1}}],["一个简单易用",{"2":{"88":1}}],["一个应用含有大量的操作函数",{"2":{"9":1}}],["一个函数里面至少包含一条日志信息",{"2":{"9":1}}],["分组规则",{"0":{"74":1}}],["分割",{"2":{"46":1}}],["服务的",{"2":{"95":1}}],["服务的图像识别插件",{"2":{"95":1}}],["服务的方式提供出来",{"2":{"45":1}}],["服务端启动服务",{"0":{"79":1}}],["服务端安装",{"0":{"78":1}}],["服务端",{"0":{"77":1},"1":{"78":1,"79":1}}],["服务",{"2":{"72":1,"76":1}}],["开发",{"2":{"104":1}}],["开启",{"2":{"72":1}}],["开头",{"2":{"41":1}}],["开头的",{"2":{"11":1}}],["如",{"2":{"69":1,"114":1,"129":1}}],["如果一个页面元素操作比较多",{"2":{"126":1}}],["如果一个应用存在多个页面",{"2":{"126":1}}],["如果涉及到复杂步骤的封装",{"2":{"109":1}}],["如果要修改识别语言",{"2":{"87":1}}],["如果存在多个",{"2":{"85":1}}],["如果你想修改端口",{"2":{"79":1}}],["如果你想执行这个",{"2":{"62":1}}],["如果应用受到新需求影响需要跳过",{"2":{"39":1}}],["如果不传默认截取全屏识别",{"2":{"34":1}}],["如果不传参",{"2":{"34":1}}],["如果用常规的图像识别则有可能无法识别到",{"2":{"34":1}}],["如果比较复杂操作步骤",{"2":{"9":1}}],["会自动加载并执行",{"2":{"69":1}}],["会自动生成一个命令",{"2":{"49":1,"50":1}}],["支持对用例执行的各个阶段插入钩子",{"2":{"137":1}}],["支持对各种测试策略的驱动执行",{"2":{"135":1}}],["支持对依赖环境进行一键打包",{"2":{"122":1}}],["支持用例目录或文件路径驱动执行",{"2":{"118":1}}],["支持基于关键词驱动用例执行",{"2":{"118":1}}],["支持基于测试单驱动插件驱动用例执行",{"2":{"118":1}}],["支持基于用例标签化管理驱动用例执行",{"2":{"118":1}}],["支持本地和远程执行模式",{"2":{"118":1}}],["支持多种用例驱动模式",{"2":{"114":1}}],["支持非开发者下运行",{"2":{"112":1}}],["支持离线部署",{"2":{"112":1}}],["支持在非开发着环境下运行用例",{"2":{"136":1}}],["支持在",{"2":{"68":1}}],["支持类名包含",{"2":{"11":1}}],["支持类名以",{"2":{"11":2}}],["加引号",{"2":{"67":1}}],["加上装饰器",{"2":{"12":1}}],["批量用例id驱动执行",{"0":{"66":1}}],["特有的",{"2":{"65":1}}],["特殊标签",{"2":{"37":1}}],["表达式",{"2":{"64":1,"65":1}}],["表示返回识别到的第一个",{"2":{"87":1}}],["表示用例的id",{"2":{"37":1}}],["表示识别任意一个目标字符",{"2":{"34":1}}],["表示识别所有目标字符",{"2":{"34":1}}],["关键词驱动等等",{"2":{"114":1}}],["关键词驱动支持",{"2":{"64":1}}],["关键词可以是用例对象中的任意字符",{"2":{"64":1}}],["整体数据流",{"0":{"116":1}}],["整体结构",{"0":{"2":1}}],["整个字符串中可以任意截取字符作为关键词",{"2":{"64":1}}],["且有完善的单元测试机制",{"2":{"104":1}}],["且存在较多涉及用例逻辑的复杂步骤方法",{"2":{"104":1}}],["且大小写不敏感",{"2":{"64":1}}],["且要方便能使用",{"2":{"44":1}}],["根据标签执行",{"0":{"65":1}}],["根据关键词执行",{"0":{"64":1}}],["根据不同的测试类型选择以上不同的安装命令",{"2":{"56":1}}],["根据不同的架构对等待时间进行倍数放大",{"2":{"21":1}}],["│\\t└──",{"2":{"63":1}}],["│\\t├──",{"2":{"63":1}}],["│",{"2":{"63":5,"99":5,"108":22,"124":12}}],["指定某张图片查找某个字符串的坐标",{"0":{"86":1}}],["指定某张图片识别的所有文字内容",{"0":{"84":1}}],["指定某个目录执行",{"0":{"63":1}}],["指定用例目录",{"2":{"67":1}}],["指定用例文件",{"2":{"67":1}}],["指定用例文件路径执行",{"0":{"67":1}}],["指定执行某一个用例",{"0":{"62":1}}],["本地执行子命令为",{"2":{"59":1}}],["本地执行",{"0":{"58":1},"1":{"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1}}],["本机命令行交互",{"0":{"24":1},"1":{"25":1,"26":1,"27":1}}],["创建一个目录",{"2":{"57":1}}],["创建用例工程",{"0":{"57":1}}],["基类",{"2":{"91":3}}],["基础环境默认支持",{"2":{"56":1}}],["基础环境guiwebuidbushttpremote",{"2":{"56":1}}],["基于此",{"2":{"9":1}}],["基于",{"2":{"9":1,"65":1,"76":1,"95":3}}],["快速开始",{"0":{"55":1},"1":{"56":1,"57":1}}],["无限可能",{"2":{"54":1}}],["🤙️",{"2":{"54":1}}],["接口自动化测试",{"2":{"54":2}}],["接口从而控制远程机器执行用例步骤",{"2":{"45":1}}],["🔥",{"2":{"95":1}}],["🚧",{"2":{"95":3}}],["🕷️",{"2":{"54":1}}],["🚀",{"2":{"54":1}}],["🚌",{"2":{"54":1}}],["💻",{"2":{"54":1}}],["🌏",{"2":{"54":1}}],["桌面应用",{"2":{"54":1}}],["☑",{"2":{"54":6}}],["能满足公司对自动化测试的业务需求",{"2":{"111":1}}],["能做什么",{"0":{"54":1}}],["能不能基于框架执行时",{"2":{"9":1}}],["$",{"2":{"52":1}}],["v25",{"2":{"101":1}}],["v20",{"2":{"101":2}}],["video",{"2":{"95":1}}],["virtualenv",{"2":{"52":1}}],["values",{"2":{"34":3}}],["删除虚拟环境",{"2":{"50":1}}],["激活虚拟环境",{"2":{"50":1}}],["命令安装使用",{"2":{"101":1}}],["命令可以将当前的虚拟环境删除",{"2":{"53":1}}],["命令",{"2":{"50":1}}],["命令行参数可以通过驱动命令提供入参选项",{"2":{"119":1}}],["命令行自动化",{"2":{"56":1}}],["命令行自动化测试",{"2":{"54":1}}],["命令行",{"2":{"46":1}}],["命令行传递参数",{"2":{"42":1}}],["命令行交互",{"0":{"23":1},"1":{"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1}}],["执行管理器接收命令行参数并读取公共配置项驱动用例执行",{"2":{"116":1}}],["执行模式支持本地驱动执行和远程驱动执行",{"2":{"114":1}}],["执行策略",{"0":{"75":1}}],["执行前确保远程机器已经开启了",{"2":{"72":1}}],["执行包含关键词的用例",{"2":{"64":1}}],["执行所有用例",{"0":{"61":1}}],["执行之后会自动创建一些有用的命令",{"2":{"50":1}}],["执行的时候会自动输出",{"2":{"12":1}}],["子命令",{"0":{"59":1,"72":1},"2":{"50":1}}],["还可以进行环境的管理",{"2":{"50":1}}],["虚拟环境默认在用例功能根目录下创建",{"2":{"122":1}}],["虚拟环境",{"0":{"50":1},"1":{"51":1,"52":1,"53":1}}],["种方式传入",{"2":{"46":1}}],["机器信息有",{"2":{"46":1}}],["它不能脱离",{"2":{"104":1}}],["它除了可以驱动用例执行",{"2":{"50":1}}],["它保存了远程测试机的信息列表",{"2":{"46":1}}],["它继承了",{"2":{"33":1}}],["交互的基础能力",{"2":{"45":1}}],["远程测试机分组策略",{"0":{"73":1},"1":{"74":1,"75":1}}],["远程机器执行的用例相同",{"2":{"72":1}}],["远程执行使用子命令",{"2":{"72":1}}],["远程执行就是用本地作为服务端控制远程机器执行",{"2":{"72":1}}],["远程执行",{"0":{"71":1},"1":{"72":1,"73":1,"74":1,"75":1}}],["远程交互式控制",{"0":{"45":1},"1":{"46":1,"47":1,"48":1}}],["远程命令行交互",{"0":{"28":1},"1":{"29":1,"30":1,"31":1}}],["打开进行编辑查看",{"2":{"44":1}}],["此配置文件需要维护大量的标签数据",{"2":{"44":1}}],["此时会抛异常",{"2":{"120":1}}],["此时",{"2":{"37":1}}],["已废弃",{"2":{"43":1}}],["已修复",{"2":{"42":2,"43":1}}],["废弃原因",{"2":{"43":1}}],["废弃用例是特殊的标签",{"2":{"37":1}}],["废弃用例",{"0":{"43":1},"2":{"36":1,"43":2}}],["该列存在",{"2":{"43":1}}],["环境依赖管理",{"0":{"122":1}}],["环境依赖管理等相关功能的目录文件也都一键生成",{"2":{"114":1}}],["环境依赖可以一键打包交付",{"2":{"112":1}}],["环境以提供",{"2":{"45":1}}],["环境影响或评估不再适用于自动化测试时",{"2":{"43":1}}],["环境信息",{"2":{"3":1}}],["针对某些用例",{"2":{"43":1}}],["针对于某些用例修复后",{"2":{"42":1}}],["yes",{"2":{"42":2}}],["youqu2",{"0":{"104":1},"2":{"95":1,"104":4,"111":3,"112":1}}],["youqu",{"0":{"69":1,"70":1},"2":{"46":1,"65":1,"68":2,"69":3,"95":9,"111":1}}],["youqu3",{"0":{"51":1,"52":1,"53":1,"54":1,"95":1,"110":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1},"2":{"9":2,"12":2,"13":1,"21":1,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"32":1,"33":3,"34":10,"45":1,"48":1,"49":2,"50":5,"51":1,"52":5,"53":1,"56":7,"57":1,"59":2,"61":2,"62":4,"63":2,"64":2,"65":2,"66":2,"67":6,"68":1,"69":1,"72":2,"75":2,"95":3,"97":1,"104":2,"106":1,"109":1,"111":1,"112":1,"114":1,"116":2,"118":1,"119":1,"123":1,"126":1,"128":2,"129":1}}],["you",{"2":{"16":1,"19":1}}],["中间件",{"2":{"120":1}}],["中用例增删改",{"2":{"95":1}}],["中文",{"2":{"87":1}}],["中同时填入后",{"2":{"42":1}}],["中的任意一个",{"2":{"34":1}}],["当传入要查找的字符串时",{"2":{"87":1}}],["当系统中安装了",{"2":{"49":1,"50":1}}],["当",{"2":{"42":1}}],["固定填入字段为",{"2":{"42":1}}],["固定跳过",{"0":{"39":1}}],["作为父类被",{"2":{"128":1}}],["作为标记该用例是否已经修复",{"2":{"42":1}}],["作为变量输出出来了",{"2":{"12":1}}],["新增一列标签名为",{"2":{"42":1}}],["但若用例层调用了此插件提供的功能",{"2":{"120":1}}],["但",{"2":{"111":1}}],["但仍然想要跳过用例",{"2":{"42":1}}],["但不能立即删除跳过原因",{"2":{"42":1}}],["但标签化管理的核心目的是集中化管理用例的标签",{"2":{"37":1}}],["推荐统一使用",{"2":{"41":1}}],["连接符号不可使用下划线和逗号",{"2":{"41":1}}],["连接服务器重试次数",{"2":{"34":1}}],["若插件没有被安装",{"2":{"120":1}}],["若插件已经安装",{"2":{"116":1}}],["若需要多个",{"2":{"41":1}}],["若函数需要多个参数",{"2":{"41":1}}],["若是",{"2":{"40":1}}],["重要",{"2":{"41":1}}],["重试间隔时间",{"2":{"34":1}}],["截取的左侧字符串作为函数名",{"2":{"41":1}}],["截取屏幕图片的间隔时间",{"2":{"34":1}}],["截取屏幕图片的时间",{"2":{"34":1}}],["korean",{"2":{"87":1}}],["k",{"2":{"62":4,"63":2,"64":2}}],["klvvw5821",{"2":{"40":1}}],["klvv",{"2":{"40":1}}],["keywords",{"0":{"70":1},"2":{"6":1,"68":1}}],["符号将两个方法分开",{"2":{"41":1}}],["符号",{"2":{"40":1,"41":1}}],["剔除中横线和",{"2":{"40":1}}],["型号",{"2":{"40":1}}],["查看机器的",{"2":{"40":1}}],["查找图片",{"2":{"12":2}}],["说明",{"2":{"40":1,"50":1}}],["则正常调用",{"2":{"116":1}}],["则返回一个字典",{"2":{"85":1}}],["则用例不会执行",{"2":{"43":1}}],["则用例不执行",{"2":{"41":1}}],["则新增一列标签名为",{"2":{"43":1}}],["则代码不会执行该条用例",{"2":{"42":1}}],["则执行该用例",{"2":{"41":1}}],["则跳过用例不执行",{"2":{"40":1}}],["则在此列备注具体的跳过原因",{"2":{"39":1}}],["或者",{"2":{"40":1}}],["判断当前架构是否为",{"2":{"40":1}}],["拼接",{"2":{"40":1}}],["多个用例文件",{"2":{"67":1}}],["多个机器信息用",{"2":{"46":1}}],["多个架构之间使用",{"2":{"40":1}}],["多个参数以逗号隔开",{"2":{"11":3}}],["架构设计",{"0":{"113":1,"115":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["架构设计规划",{"0":{"110":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1}}],["架构不跳过",{"2":{"40":1}}],["架构跳过",{"2":{"40":1}}],["架构名",{"2":{"40":1}}],["架构动态等待",{"0":{"21":1}}],["常见的场景为在不同架构上判断是否执行",{"2":{"40":1}}],["某些用例会因为不同的环境判断用例是否执行",{"2":{"40":1}}],["参数",{"2":{"40":2}}],["参数值可以传递任意命令行命令",{"2":{"16":1,"19":1}}],["最后所有的用例类均继承",{"2":{"128":1}}],["最终的用例状态会被标签为",{"2":{"39":1}}],["最大匹配次数",{"2":{"34":1}}],["最大匹配超时",{"2":{"34":1}}],["受到某新需求影响",{"2":{"39":1,"42":1,"43":1}}],["各模块编写思路",{"0":{"125":1},"1":{"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"135":1,"136":1,"137":1}}],["各功能以插件的方式接入",{"2":{"114":1}}],["各种代码风格不统一",{"2":{"104":1}}],["各种用例标签",{"2":{"39":1,"40":1,"42":1,"43":1}}],["各架构倍数",{"2":{"21":1}}],["示例",{"2":{"39":1,"40":1,"42":1}}],["而通过",{"2":{"38":1}}],["传统跳过用例的方式是在用例脚本里面给用例添加装饰器",{"2":{"38":1}}],["传统的日志输出方式",{"2":{"9":1}}],["跳过对象",{"2":{"40":1}}],["跳过的原因标签为",{"2":{"40":1}}],["跳过的原因统一标签开头为",{"2":{"39":1}}],["跳过用例可以直接通过修改",{"2":{"130":1}}],["跳过用例",{"0":{"38":1},"1":{"39":1,"40":1,"41":1}}],["跳过原因一栏中填写为",{"2":{"40":1}}],["跳过原因",{"2":{"36":1,"37":1,"38":1,"39":1,"40":1,"42":2,"43":1}}],["因此我们才萌生了对框架结构进行重新设计想法",{"2":{"111":1}}],["因此我们大胆的设想",{"2":{"9":1}}],["因此",{"2":{"103":1,"104":1}}],["因此你仍然可以在虚拟环境中使用命令",{"2":{"52":1}}],["因此若",{"2":{"37":1}}],["目标",{"0":{"112":1}}],["目标字符",{"2":{"34":1}}],["目录之间用空格分割",{"2":{"67":1}}],["目录组合",{"2":{"67":1}}],["目录下划分自己的用例模块",{"2":{"109":1}}],["目录下所有用例",{"2":{"63":1}}],["目录下",{"2":{"37":1}}],["所有的操作步骤都应该有一个对应的方法",{"2":{"126":1}}],["所有的方法按照",{"2":{"126":1}}],["所有的元素操作方法",{"2":{"100":1}}],["所有代码由专人维护",{"2":{"104":1}}],["所有方法以类的形式编写",{"2":{"100":1}}],["所有",{"2":{"37":1}}],["建议分模块",{"2":{"37":1}}],["比如",{"2":{"40":1,"41":1,"49":1,"64":1,"79":1,"101":2,"111":1,"126":2}}],["比如文件管理器",{"2":{"37":1}}],["比如气泡在1秒内消失",{"2":{"34":1}}],["后面会详细讲到",{"2":{"37":1}}],["后置命令行入参钩子",{"0":{"19":1}}],["后置脚本钩子",{"0":{"18":1}}],["后置钩子",{"0":{"17":1},"1":{"18":1,"19":1}}],["列之后的所有列都是一个用例标签",{"2":{"37":1}}],["列为",{"2":{"37":1}}],["第",{"2":{"37":1}}],["也可以对这个页面做进一步划分",{"2":{"126":1}}],["也可以方便对虚拟环境的管理和维护",{"2":{"122":1}}],["也可以是传统的",{"2":{"65":1}}],["也可以是自定义的数字代表用例序号",{"2":{"37":1}}],["也得到了公司领导",{"2":{"111":1}}],["也能自动打印",{"2":{"91":1}}],["也会正常执行",{"2":{"42":1}}],["也就是说我们需要写大量的日志代码",{"2":{"9":1}}],["举例",{"2":{"37":1}}],["取中间的名称作为",{"2":{"37":1}}],["去掉用例序号后的字符串",{"2":{"37":1}}],["quot",{"2":{"37":2,"56":2,"64":2,"66":2}}],["以便方法或用例中能够获取到",{"2":{"129":1}}],["以此控制虚拟环境创建",{"2":{"131":1}}],["以此来获取框架已有的公共配置",{"2":{"129":1}}],["以此类推",{"2":{"101":1}}],["以插件的形式提供功能",{"2":{"112":1}}],["以下简称测试用例",{"2":{"106":1}}],["以下简称测试方法套件",{"2":{"97":1}}],["以保持套件的各方面一致性",{"2":{"102":1}}],["以上写法表示有",{"2":{"74":1}}],["以",{"2":{"37":1,"112":1}}],["脚本文件id",{"2":{"36":1,"37":1,"39":1,"40":1}}],["脚本一样即可",{"2":{"16":1,"19":1}}],["使用更简单方便",{"2":{"112":1}}],["使用的框架不同",{"2":{"104":1}}],["使用逻辑表达式的时候一定要加引号",{"2":{"64":1,"66":1}}],["使用脚手架功能创建用例工程",{"2":{"57":1}}],["使用",{"2":{"40":1,"41":1,"101":1,"114":1}}],["使用说明",{"0":{"36":1}}],["使用方法很简单",{"2":{"12":1}}],["使用方法",{"0":{"12":1,"90":1},"1":{"91":1,"92":1,"93":1}}],["+",{"2":{"34":2,"40":1,"119":1}}],["`japan`",{"2":{"34":1}}],["`korean`",{"2":{"34":1}}],["`german`",{"2":{"34":1}}],["`fr`",{"2":{"34":1}}],["`en`",{"2":{"34":1}}],["`ch`",{"2":{"34":1}}],["返回原始数据",{"2":{"87":1}}],["返回当前屏幕中",{"2":{"85":1}}],["返回识别图片",{"2":{"84":1}}],["返回识别到的所有数据",{"2":{"34":1}}],["返回",{"2":{"41":2}}],["返回图片中识别到的所有字符串",{"2":{"34":1}}],["只需要在这里挂一个装饰器",{"2":{"91":1,"92":1,"93":1}}],["只需要在出口文件加上类装饰器",{"2":{"12":1}}],["只需要加一个装饰器",{"2":{"88":1}}],["只返回第一个",{"2":{"34":1,"87":1}}],["要识别的图片路径",{"2":{"34":1}}],["要识别的模板图片",{"2":{"34":1}}],["并提示用户安装对应插件",{"2":{"120":1}}],["并根据需要将测试结果",{"2":{"116":1}}],["并动态加载",{"2":{"116":1}}],["并在系统关键节点发布对应的版本",{"2":{"101":1}}],["并将截取的右侧作为参数传递给该函数",{"2":{"41":1}}],["并返回其在图片中的坐标",{"2":{"34":1}}],["并且所有调用的方法会以",{"2":{"12":1}}],["识别插件",{"2":{"95":1}}],["识别语言",{"2":{"87":1}}],["识别当前屏幕的所有文字内容",{"0":{"83":1}}],["识别一个字符串或多个字符串",{"2":{"34":1}}],["识别率",{"2":{"34":1}}],["结果",{"2":{"34":2}}],["结尾的",{"2":{"11":1}}],["预期值",{"2":{"34":4}}],["不需要修改用例脚本",{"2":{"130":1}}],["不需要用户去了解和思考哪些插件适合哪种测试类型",{"2":{"121":1}}],["不再提供",{"2":{"119":1}}],["不安装插件的情况下框架也能正常运行",{"2":{"112":1}}],["不适合对外开源发布",{"2":{"104":1}}],["不涉及用例逻辑",{"2":{"104":1}}],["不受需求变更影响",{"2":{"104":1}}],["不兼容",{"2":{"104":1}}],["不相为谋",{"2":{"104":1}}],["不同",{"2":{"104":1}}],["不同组之间相同执行",{"2":{"75":1}}],["不做复杂步骤的封装",{"2":{"100":1}}],["不存在复杂步骤的堆叠封装",{"2":{"104":1}}],["不存在",{"2":{"34":2}}],["不显示",{"2":{"5":1}}],["存在跳过标签则用例也不会被执行",{"2":{"39":1}}],["存在",{"2":{"34":2}}],["应用名字",{"2":{"34":2}}],["元素不应存在",{"2":{"34":1}}],["元素不存在",{"2":{"34":1}}],["元素识别动态等待",{"0":{"22":1}}],["匹配度",{"2":{"34":1,"87":1}}],["匹配元素的格式",{"2":{"34":2}}],["匹配相似度",{"2":{"34":2}}],["是在",{"2":{"104":1}}],["是不同的测试方法套件版本",{"2":{"101":1}}],["是基于",{"2":{"97":1,"104":1,"106":1}}],["是",{"2":{"46":1,"111":1}}],["是否分模块维护取决于应用的用例复杂度",{"2":{"37":1}}],["是否递归查找",{"2":{"34":1}}],["是类装饰器",{"2":{"12":1}}],["路径驱动",{"2":{"114":1}}],["路径",{"2":{"34":2}}],["断言",{"0":{"128":1}}],["断言方法类",{"2":{"124":1}}],["断言资源",{"2":{"124":1}}],["断言文案不存在",{"2":{"34":1}}],["断言文案存在",{"2":{"34":1}}],["断言文件不存在",{"2":{"34":1}}],["断言文件存在",{"2":{"34":1}}],["断言结果为假",{"2":{"34":1}}],["断言结果为真",{"2":{"34":1}}],["断言不相等",{"2":{"34":1}}],["断言相等",{"2":{"34":1}}],["断言应用进程不存在",{"2":{"34":1}}],["断言应用进程状态",{"2":{"34":4}}],["断言应用进程存在",{"2":{"34":1}}],["断言元素不存在",{"2":{"34":1}}],["断言元素存在",{"2":{"34":1}}],["断言语句",{"0":{"32":1},"1":{"33":1,"34":1}}],["~",{"2":{"34":2,"84":1,"86":1}}],["文件来控制用例是否跳过",{"2":{"130":1}}],["文件来管理跳过用例则会方便很多",{"2":{"38":1}}],["文件里面写标签的表达式",{"2":{"69":1}}],["文件里面跳过原因列是否存在跳过标签",{"2":{"39":1}}],["文件管理的标签",{"2":{"65":1}}],["文件管理器",{"2":{"48":1,"126":2}}],["文件几乎是唯一能满足所有的要求的文件格式",{"2":{"44":1}}],["文件格式",{"0":{"44":1}}],["文件中定义用例对象的标签",{"2":{"130":1}}],["文件中自定义用例集驱动执行",{"2":{"68":1}}],["文件中所有的用例",{"2":{"62":1}}],["文件中查找是否有同名函数",{"2":{"41":1}}],["文件中",{"2":{"40":1}}],["文件中新增一列为",{"2":{"38":1}}],["文件中写入标签",{"2":{"36":1}}],["文件太多了也是一个很糟糕的事情",{"2":{"37":1}}],["文件建议放在一个",{"2":{"37":1}}],["文件",{"2":{"37":1,"69":1}}],["文件的文件名",{"2":{"37":1}}],["文件去掉首字符串",{"2":{"37":1}}],["文件存在",{"2":{"34":1}}],["文件名称",{"2":{"64":1}}],["文件名就应为",{"2":{"37":1}}],["文件名",{"2":{"34":1}}],["文件全路径",{"2":{"34":1}}],["文件全路径或目录",{"2":{"34":1}}],["文件不存在",{"2":{"34":1}}],["文管方法库出口",{"2":{"12":1}}],["期望结果",{"2":{"34":2}}],["期望元素不存在",{"2":{"34":1}}],["期望元素存在",{"2":{"34":1}}],["期望不存在文件路径",{"2":{"34":1}}],["期望存在文件路径",{"2":{"34":1}}],["期望界面不存在模板图片",{"2":{"34":1}}],["期望界面存在模板图片",{"2":{"34":1}}],["屏幕上匹配不存在图片",{"2":{"34":1}}],["屏幕上匹配图片",{"2":{"34":2}}],["默认环境变量管理文件",{"0":{"131":1},"2":{"124":1}}],["默认日志输出级别为",{"2":{"94":1}}],["默认是在",{"2":{"94":1}}],["默认情况下是会将识别到的多个目标组装成字典返回",{"2":{"87":1}}],["默认端口号为",{"2":{"79":1}}],["默认值为",{"2":{"34":1}}],["默认为false",{"2":{"87":1}}],["默认为0",{"2":{"87":1}}],["默认为ch",{"2":{"87":1}}],["默认为",{"2":{"34":1}}],["默认不间隔",{"2":{"34":1}}],["默认关闭",{"2":{"5":1}}],["单位秒",{"2":{"34":3}}],[">不为假",{"2":{"34":1}}],[">不为真",{"2":{"34":1}}],[">不相等",{"2":{"34":2}}],[">是否相等",{"2":{"34":2}}],[">与实际值",{"2":{"34":4}}],[">",{"2":{"34":9}}],[">=",{"2":{"34":3}}],["例",{"2":{"34":3}}],["例如",{"2":{"9":1,"34":1,"40":1}}],["on",{"2":{"126":1,"127":1}}],["only",{"2":{"34":1}}],["or",{"2":{"34":1,"64":1,"65":3,"66":9,"69":2}}],["ocr",{"2":{"34":4,"76":1,"79":2,"83":3,"84":1,"85":1,"86":1,"87":4,"95":1}}],["os",{"2":{"34":5}}],["outcome",{"2":{"6":1}}],["8888",{"2":{"79":1,"83":1}}],["8890",{"2":{"79":1}}],["8",{"0":{"133":1},"2":{"34":1,"48":1,"91":1,"92":1,"93":1,"95":1,"111":1}}],["继承了",{"2":{"128":1}}],["继承了基类baselog",{"2":{"91":1,"92":1,"93":1}}],["继承",{"2":{"33":1,"128":1}}],["用户只需要创建符合框架定义的文件命名规范脚本文件",{"2":{"137":1}}],["用户只需要关注用例",{"2":{"114":1}}],["用户可直接通过",{"2":{"101":1}}],["用于用例开发调试过程中",{"2":{"133":1}}],["用于统一存放用例步骤的操作方法",{"2":{"126":1}}],["用于统一管理命令行参数驱动用例执行",{"2":{"118":1}}],["用于虚拟环境安装",{"2":{"50":1}}],["用于属性定位相关操作",{"2":{"48":1}}],["用于保存用例标签",{"2":{"37":1}}],["用例标签管理文件",{"0":{"130":1},"2":{"124":1}}],["用例标签化管理插件",{"2":{"95":1}}],["用例示例",{"2":{"124":2}}],["用例工程配置对象继承",{"2":{"129":1}}],["用例工程配置模块建议继承",{"2":{"119":1}}],["用例工程的断言方法类",{"2":{"128":1}}],["用例工程名称",{"2":{"124":1}}],["用例工程结构",{"0":{"124":1}}],["用例工程支持一键创建",{"2":{"123":1}}],["用例工程设计",{"0":{"123":1},"1":{"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1}}],["用例层负责管理用例逻辑",{"2":{"127":1}}],["用例层目录",{"2":{"124":1}}],["用例层",{"0":{"127":1},"2":{"114":1}}],["用例层直接",{"2":{"114":1}}],["用例整体打包交付之后",{"2":{"112":1}}],["用例开发环境下更新版本不方便",{"2":{"111":1}}],["用例失败录屏插件",{"2":{"95":1}}],["用例文件",{"2":{"67":1}}],["用例驱动方式",{"0":{"60":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1}}],["用例执行所需要的资源",{"2":{"124":1}}],["用例执行完成后生成多种测试报告",{"2":{"116":1}}],["用例执行过程中动态调用",{"2":{"116":1}}],["用例执行驱动的命令",{"2":{"50":1}}],["用例执行时判断",{"2":{"39":1}}],["用例需要废弃",{"2":{"43":1}}],["用例id",{"2":{"42":1,"43":1}}],["用例脚本的",{"2":{"37":1}}],["用例中所需要的方法从",{"2":{"109":1}}],["用例中通过",{"2":{"33":1}}],["用例中使用方法",{"0":{"33":1}}],["用例基类",{"2":{"33":2,"124":1}}],["用两对大括号把函数的参数括起来",{"2":{"12":1}}],["几乎满足了所有的断言场景",{"2":{"32":1}}],["自定义执行",{"0":{"68":1},"1":{"69":1,"70":1}}],["自定义条件判断跳过的函数写在此文件中",{"2":{"41":1}}],["自定义跳过",{"0":{"41":1}}],["自定义断言类",{"2":{"34":1}}],["自带多种断言语句",{"2":{"32":1}}],["自动安装框架及改测试类型需要的插件依赖",{"2":{"121":1}}],["自动统计分析每次",{"2":{"95":1}}],["自动化插件",{"2":{"95":1}}],["自动化测试框架",{"2":{"112":1}}],["自动化测试框架操作方法封装写法",{"2":{"9":1}}],["自动化测试用例",{"0":{"105":1},"1":{"106":1,"107":1,"108":1,"109":1},"2":{"106":1}}],["自动化测试方法套件",{"0":{"96":1},"1":{"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1},"2":{"97":1}}],["自动化测试模块",{"2":{"95":1}}],["自动化测试",{"2":{"54":2}}],["自动输出日志的类名称",{"2":{"94":1}}],["自动输出日志",{"0":{"91":1}}],["自动输出的日志",{"2":{"12":1}}],["自动识别当前整个屏幕的所有内容",{"2":{"83":1}}],["自动将函数说明打印为日志",{"2":{"11":3}}],["自动的将函数说明作为日志打印出来",{"2":{"9":1}}],["umtk",{"0":{"96":1,"104":1},"1":{"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1},"2":{"97":1,"99":1,"100":1,"101":2,"104":4,"106":1,"109":2}}],["ui操作远程对象",{"0":{"47":1},"1":{"48":1}}],["ui",{"2":{"45":2,"54":2,"95":1,"108":1,"124":1}}],["union",{"2":{"34":3}}],["uniontech",{"2":{"34":1,"91":1,"92":1,"93":1}}],["utf",{"2":{"34":1,"91":1,"92":1,"93":1}}],["usable",{"2":{"95":1}}],["usr",{"2":{"34":1,"91":1,"92":1,"93":1}}],["user4",{"2":{"74":2,"75":2}}],["user3",{"2":{"74":2,"75":2}}],["user2",{"2":{"74":2,"75":2}}],["user1",{"2":{"74":2,"75":2}}],["user=",{"2":{"48":1}}],["user=user",{"2":{"48":1}}],["user",{"2":{"29":1,"30":1,"31":1,"48":1,"94":1}}],["username",{"2":{"27":1}}],["uos",{"0":{"96":1,"105":1},"1":{"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"106":1,"107":1,"108":1,"109":1},"2":{"12":1,"48":1,"97":4,"104":1,"106":3}}],["普通权限执行",{"0":{"25":1,"29":1}}],["增加了等待的日志",{"2":{"21":1}}],["优化",{"2":{"21":1}}],["可实现群控测试机执行",{"2":{"112":1}}],["可视化配置",{"0":{"135":1},"2":{"112":1}}],["可视化驱动",{"2":{"95":1}}],["可定制化依赖",{"2":{"112":1}}],["可能存在当前屏幕中有多个目标",{"2":{"87":1}}],["可能包含多条日志信息",{"2":{"9":1}}],["可自定义多个参数之间的连接符",{"2":{"41":1}}],["可以通过系统环境变量或修改",{"2":{"119":1}}],["可以根据测试项目类型安装对应的依赖",{"2":{"112":1}}],["可以在通过命令行快速驱动测试用例执行",{"2":{"114":1}}],["可以在无网络环境下直接运行",{"2":{"112":1}}],["可以在方法层",{"2":{"109":1}}],["可以对外开源发布",{"2":{"104":1}}],["可以调用",{"2":{"100":1}}],["可以修改为从0到1的数",{"2":{"87":1}}],["可以自动安装对应的依赖集",{"2":{"56":1}}],["可以自动加载虚拟环境并驱动用例工程",{"2":{"51":1}}],["可以激活虚拟环境",{"2":{"52":1}}],["可以随意新增",{"2":{"37":1}}],["可以完全代替之前这样的写法",{"2":{"21":1}}],["german",{"2":{"87":1}}],["get",{"2":{"34":3}}],["getmembers",{"2":{"10":1}}],["group2",{"2":{"74":1,"75":1}}],["group1",{"2":{"74":1,"75":2}}],["group",{"2":{"74":1}}],["gui",{"2":{"34":7,"48":3,"56":2,"95":1,"109":1}}],["gpl",{"2":{"34":1}}],["github",{"2":{"76":1,"88":1}}],["git",{"2":{"16":1,"19":1,"95":1,"114":1}}],["home",{"2":{"94":1}}],["html",{"2":{"95":2}}],["https",{"2":{"76":1,"88":1}}],["http",{"2":{"54":1,"56":1}}],["htop",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1}}],["h",{"2":{"49":1}}],["has",{"2":{"7":1}}],["就能自动日志输出类里面所有的方法的功能说明",{"2":{"88":1}}],["就像写",{"2":{"16":1,"19":1}}],["就可以实现自动输出日志了",{"2":{"12":1}}],["入参",{"2":{"16":1,"19":1}}],["├──",{"2":{"15":3,"18":3,"63":4,"99":9,"108":19,"124":17}}],["框架预设一些文件接口规范",{"2":{"137":1}}],["框架的安装命令可以根据用例工程所属的测试类型",{"2":{"121":1}}],["框架的断言库",{"2":{"33":1}}],["框架可以正常运行",{"2":{"120":1}}],["框架底层对各功能插件提供",{"2":{"120":1}}],["框架总线接口",{"0":{"120":1}}],["框架提供驱动命令",{"2":{"118":1}}],["框架提供驱动执行的命令",{"2":{"114":1}}],["框架驱动命令传递命令行参数给执行管理器",{"2":{"116":1}}],["框架也提供初始化用例工程的功能",{"2":{"114":1}}],["框架源代码不直接呈现在用户面前",{"2":{"114":1}}],["框架代码及插件库以",{"2":{"114":1}}],["框架层提供总线服务",{"2":{"114":1}}],["框架和插件库独立维护更新",{"2":{"112":1}}],["框架而独立使用",{"2":{"104":1}}],["框架会在用例执行之前执行",{"2":{"16":1,"19":1}}],["框架会在用例执行之前自动加载并执行",{"2":{"15":1,"18":1}}],["框架支持通过",{"2":{"16":1,"19":1}}],["框架默认生成",{"2":{"0":1}}],["前置命令行入参钩子",{"0":{"16":1}}],["前置脚本钩子",{"0":{"15":1}}],["前置钩子",{"0":{"14":1},"1":{"15":1,"16":1}}],["前后钩子",{"0":{"13":1},"1":{"14":1,"15":1,"16":1,"17":1,"18":1,"19":1}}],["这些元素操作方法可以用于自动化用例调用",{"2":{"97":1}}],["这是在类外面打",{"2":{"93":3}}],["这是我想再输出的其他",{"2":{"92":3}}],["这个命令可以在系统原生环境中使用",{"2":{"50":1}}],["这样在用例中能够使用统一的断言语句",{"2":{"128":1}}],["这样在日志输出的时候就能把调用函数时参数的值输出出来",{"2":{"12":1}}],["这样这条用例即使同时标记了",{"2":{"42":1}}],["这种方式需要修改用例代码",{"2":{"38":1}}],["这就是我们参考django",{"2":{"12":1}}],["japan",{"2":{"87":1}}],["job",{"2":{"15":2,"16":3,"18":2,"19":3}}],["jinja2",{"2":{"12":1}}],["json",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"2":{"0":3,"2":1,"3":1,"4":1,"6":1,"7":1}}],["和上面逻辑相反",{"2":{"40":1}}],["和",{"0":{"104":1},"2":{"12":1,"42":2,"75":1,"104":2,"106":1,"111":1}}],["没错",{"2":{"12":1}}],["函数名等等都可以做为关键词",{"2":{"64":1}}],["函数名",{"2":{"40":1}}],["函数功能说明中",{"2":{"12":1}}],["函数说明以及函数操作日志",{"2":{"9":1}}],["细心的同学可能还发现了一个小细节",{"2":{"12":1}}],["展示在",{"2":{"12":1}}],["静态方法",{"2":{"12":1}}],["包的形式提供框架能力",{"2":{"112":1}}],["包含客户端和服务端",{"2":{"76":1}}],["包含",{"2":{"75":1}}],["包含静态方法",{"2":{"10":1}}],["包括实例方法",{"2":{"12":1}}],["之后",{"2":{"12":1,"49":1,"50":1}}],["|",{"2":{"12":2}}],["md",{"2":{"99":1,"108":1}}],["movie",{"2":{"99":1}}],["mousekey",{"2":{"95":1}}],["mode",{"2":{"34":6}}],["music",{"2":{"64":5,"67":6,"99":3}}],["multiple=multiple",{"2":{"12":1,"34":2}}],["multiple=false",{"2":{"12":1}}],["multiple",{"2":{"12":1,"34":2}}],["my",{"2":{"33":1,"52":1,"57":2,"63":1,"124":2,"126":1,"127":1}}],["mycasemethod",{"2":{"126":1,"127":2}}],["mycase",{"2":{"33":1,"63":2,"124":3,"127":2,"128":2}}],["maintainer",{"2":{"102":1}}],["main",{"2":{"48":1,"91":1,"92":1,"93":1}}],["manage",{"2":{"42":1,"95":1,"126":1,"127":1}}],["manager",{"2":{"34":1,"48":2,"99":2,"100":2,"101":1,"108":2,"109":1,"127":1}}],["mark",{"2":{"38":1,"65":1,"95":1}}],["max",{"2":{"34":7}}],["match",{"2":{"34":11}}],["machine",{"2":{"27":1}}],["map",{"2":{"12":1}}],["mips64",{"2":{"21":1}}],["method",{"2":{"11":1,"12":3,"15":1,"18":1,"33":4,"91":12,"92":2,"97":1,"99":4,"108":5,"109":1,"124":4,"126":3,"127":2,"128":4}}],["metadata",{"2":{"3":1,"6":1}}],["message",{"2":{"7":1}}],["注意给元组类型",{"2":{"94":1}}],["注意这里",{"2":{"91":1,"92":1,"93":1}}],["注意ip和端口要和你的服务端ip对应",{"2":{"83":1}}],["注意",{"2":{"12":1,"56":1,"64":1,"66":1,"67":1}}],["num",{"2":{"95":1}}],["number=max",{"2":{"34":2}}],["number=match",{"2":{"34":2}}],["number",{"2":{"34":9}}],["network",{"2":{"34":9}}],["not",{"2":{"34":13,"40":2,"64":1,"65":1}}],["none",{"2":{"34":26}}],["nodeid",{"2":{"6":1,"7":1}}],["n",{"2":{"27":1}}],["name",{"2":{"11":3,"40":3,"48":1,"91":2,"92":2,"93":2,"94":4,"95":1}}],["==",{"2":{"34":5,"48":1,"91":1,"92":1,"93":1}}],["=",{"2":{"11":4,"12":1,"21":5,"34":36,"48":2,"79":1,"83":2,"91":1,"92":1,"93":1,"94":3}}],["动态等待",{"0":{"20":1},"1":{"21":1,"22":1}}],["动态添加日志装饰器",{"2":{"10":1}}],["动态给该类下所有的函数及父类函数添加日志装饰器",{"2":{"10":1}}],["给符合条件的函数",{"2":{"10":1}}],["实际结果",{"2":{"34":2}}],["实例",{"2":{"12":1}}],["实例方法",{"2":{"10":1}}],["实现插件依赖的定制化",{"2":{"114":1}}],["实现步骤",{"2":{"10":1}}],["实现原理",{"0":{"10":1}}],["类似于单元测试",{"2":{"103":1}}],["类名包含什么字符",{"2":{"94":1}}],["类名以什么结尾",{"2":{"94":1}}],["类名以什么开头",{"2":{"94":1}}],["类名",{"2":{"64":1}}],["类",{"2":{"10":1,"91":3,"92":1}}],["类方法",{"2":{"10":1,"12":1}}],["类里面一个函数只包含一个操作或多次调用的一系列可合并的操作",{"2":{"9":1}}],["在浏览器中输入一些配置后即可驱动测试用例执行",{"2":{"112":1}}],["在继承",{"2":{"112":1}}],["在现有框架下",{"2":{"111":1}}],["在公司的多个自动化流程中运行得很好",{"2":{"111":1}}],["在公司内部已经被大量的自动化测试项目使用",{"2":{"111":1}}],["在操作方法多了之后",{"2":{"103":1}}],["在同一个大版本中",{"2":{"101":1}}],["在不同的代码仓库中",{"2":{"101":1}}],["在外层其他直接使用",{"0":{"93":1}}],["在全屏指定查找某个字符串的坐标",{"0":{"85":1}}],["在根目录下定义",{"2":{"69":1}}],["在服务端通过调用",{"2":{"45":1}}],["在远程测试机上部署一个完整的",{"2":{"45":1}}],["在用例执行过程中控制远程机器执行复杂的",{"2":{"45":1}}],["在用例收集阶段会以第一个",{"2":{"41":1}}],["在用例工程根目录下存放",{"2":{"41":1}}],["在用例工程目录下存放一个",{"2":{"15":1,"18":1}}],["在用例工程目录下生成报告文件",{"2":{"0":1}}],["在子项目目录下新建",{"2":{"37":1}}],["在",{"2":{"36":1,"38":1,"40":1,"41":1,"130":1}}],["在一段时间内截图多张图片进行识别",{"2":{"34":1}}],["在报告中更能一目了然的看到用例执行步骤",{"2":{"12":1}}],["在屏幕中相似度大于",{"2":{"12":2}}],["在应用库",{"2":{"12":1}}],["在此装饰器中我们能动态的捕获所调用函数的功能说明",{"2":{"10":1}}],["核心原理",{"2":{"10":1}}],["的路径",{"2":{"129":1}}],["的思路",{"2":{"126":1}}],["的框架下进行开发的",{"2":{"104":1}}],["的公共方法库",{"0":{"104":1},"2":{"104":1}}],["的内容",{"2":{"84":1}}],["的用例",{"2":{"42":1}}],["的脚本",{"2":{"15":1,"18":1}}],["的模板语法设计出的日志模板语法",{"2":{"12":1}}],["的坐标",{"2":{"12":2,"85":1}}],["的",{"2":{"11":1,"95":1,"128":1}}],["的方式",{"2":{"10":1,"12":1}}],["的日志系统",{"2":{"9":1}}],["的想法",{"2":{"9":1}}],["那真是妙啊~",{"2":{"9":1}}],["从任务栏启动文件管理器",{"2":{"127":1}}],["从而驱动测试用例执行",{"2":{"118":1}}],["从而减少大量日志代码量和重复编写",{"2":{"9":1}}],["从开源至今发布了",{"2":{"111":1}}],["从第",{"2":{"37":1}}],["从上面的例子也可以看出来",{"2":{"9":1}}],["具有较高的重复度",{"2":{"9":1}}],["通过配置的接口进行数据回填",{"2":{"116":1}}],["通过命令行参数控制",{"2":{"114":1}}],["通过不同的参数控制返回不同的值",{"2":{"76":1}}],["通过获取该函数返回的布尔值",{"2":{"41":1}}],["通过ocr识别到不应存在的文案",{"2":{"34":2}}],["通过ocr未识别到",{"2":{"34":3}}],["通过观察前面的例子",{"2":{"12":1}}],["通过",{"2":{"10":2}}],["通过日志输出器将其输出即可",{"2":{"10":1}}],["通过给类加上一个装饰器",{"2":{"10":1}}],["通过经验观察",{"2":{"9":1}}],["通常是这样的",{"2":{"9":1}}],["省略代码部分",{"2":{"9":1}}],["l1",{"2":{"65":3}}],["lang",{"2":{"34":1,"87":1}}],["lang=lang",{"2":{"34":2}}],["lang=",{"2":{"34":2,"87":1}}],["lambda",{"2":{"12":1,"34":2}}],["leftmethod",{"2":{"126":1}}],["len",{"2":{"34":4}}],["level日志级别",{"2":{"94":1}}],["level",{"2":{"11":1,"94":1}}],["list",{"2":{"34":1}}],["license",{"2":{"34":1,"91":2,"92":2,"93":2,"99":1,"108":1}}],["lineno",{"2":{"6":1}}],["linuxdeepin",{"2":{"76":1,"88":1,"111":1}}],["linux",{"2":{"3":1,"54":3,"56":1,"95":1,"112":1}}],["ltd",{"2":{"34":1,"91":1,"92":1,"93":1}}],["l",{"2":{"27":1,"29":1}}],["ls",{"2":{"25":1,"27":1,"29":1}}],["loogarch64",{"2":{"40":2}}],["loongarch64",{"2":{"21":1}}],["lower",{"2":{"34":1}}],["logs",{"2":{"94":1}}],["log装饰器自动打印",{"2":{"91":1,"92":1}}],["log",{"2":{"10":1,"11":1,"12":5,"34":2,"91":3,"92":3,"93":6,"94":4}}],["logger直接调用",{"2":{"93":1}}],["logger",{"2":{"9":1,"12":1,"34":12,"91":2,"92":5,"93":5}}],["点击某个元素",{"2":{"9":2,"12":1}}],["dragon",{"2":{"95":1}}],["driver",{"2":{"95":1,"118":2}}],["d",{"2":{"95":1}}],["dbus",{"2":{"54":1,"56":1}}],["dmidecode",{"2":{"40":1}}],["dict",{"2":{"34":4}}],["ddefilemanagermethod",{"2":{"100":2,"101":1,"109":1}}],["dde",{"2":{"34":1,"48":3,"99":2,"100":2,"101":1,"108":4,"109":1,"126":1,"127":2}}],["during",{"2":{"34":2}}],["duration",{"2":{"2":1}}],["dogtail",{"2":{"48":1,"95":1,"126":3}}],["do",{"2":{"16":2,"19":2}}],["dock",{"2":{"48":1,"108":4,"126":1,"127":1}}],["doc",{"2":{"10":1}}],["dfm",{"2":{"12":2,"108":2}}],["deepin",{"2":{"99":4}}],["desc",{"2":{"95":1}}],["desktop",{"2":{"34":2,"84":1,"86":1}}],["debug",{"2":{"11":1,"91":1,"92":3,"93":3,"94":1,"124":1,"133":1}}],["default=false",{"2":{"87":1}}],["default",{"2":{"87":1}}],["def",{"2":{"9":1,"12":2,"33":1,"34":15,"48":2,"62":2,"91":6,"92":1,"127":1,"128":1}}],["需要在每个函数里面主动编写日志输出代码",{"2":{"9":1}}],["背景",{"0":{"9":1,"111":1}}],["id4",{"2":{"66":3}}],["id3",{"2":{"66":3,"69":1}}],["id2",{"2":{"66":3,"69":1}}],["id1",{"2":{"66":3,"69":1}}],["identifier",{"2":{"34":1,"91":1,"92":1,"93":1}}],["issue",{"2":{"102":1}}],["isinstance",{"2":{"34":4}}],["is",{"2":{"34":6}}],["ifixed",{"2":{"42":2}}],["if",{"2":{"34":23,"48":1,"91":1,"92":1,"93":1}}],["ip4",{"2":{"74":2,"75":2}}],["ip3",{"2":{"74":2,"75":2}}],["ip2",{"2":{"74":2,"75":2}}],["ip1",{"2":{"74":2,"75":2}}],["ip=",{"2":{"48":1}}],["ip=ip",{"2":{"48":1}}],["ip",{"2":{"27":1,"29":1,"30":1,"31":1,"48":1,"83":1}}],["imagecenter",{"2":{"95":1}}],["image",{"2":{"12":4,"34":6,"124":1,"129":1}}],["import",{"2":{"11":1,"12":2,"21":2,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"33":3,"34":12,"48":2,"79":3,"83":2,"91":3,"92":3,"93":3,"94":3,"100":1,"101":1,"109":2,"114":1,"126":2,"127":2,"128":3}}],["in",{"2":{"34":2}}],["int",{"2":{"34":18}}],["ini",{"2":{"108":2,"119":1,"124":1}}],["inix86",{"2":{"21":1}}],["init",{"2":{"7":1,"48":1,"57":1,"63":1,"99":3,"108":4,"123":1,"124":2}}],["install",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1,"56":7,"78":1,"81":1,"89":1,"101":1}}],["inspect",{"2":{"10":1}}],["info",{"2":{"9":1,"11":2,"12":1,"34":11,"92":2,"93":2,"94":1}}],["items",{"2":{"34":2}}],["it",{"2":{"7":1}}],["autotest",{"2":{"57":2,"97":1}}],["auto",{"2":{"48":3}}],["amp",{"2":{"40":3,"41":5}}],["album",{"2":{"37":2}}],["all",{"2":{"34":5}}],["allure",{"2":{"12":2}}],["and",{"2":{"34":3,"64":4,"65":1}}],["any",{"2":{"34":3}}],["arrch64",{"2":{"40":1}}],["args",{"2":{"34":7}}],["arch",{"2":{"3":2}}],["actual",{"2":{"34":10}}],["as",{"2":{"34":6}}],["assertoptionerror",{"2":{"34":3}}],["assertionerror",{"2":{"34":18}}],["assertmethod",{"2":{"33":5,"128":5}}],["assertx",{"2":{"33":1}}],["assert",{"2":{"33":6,"34":18,"108":1,"124":2,"127":1,"128":9,"129":1}}],["abspath=",{"2":{"84":1,"86":1}}],["abspath=config",{"2":{"48":1}}],["abspath=pic",{"2":{"34":2}}],["abspath=picture",{"2":{"34":2}}],["abspath=none",{"2":{"34":2}}],["abspath",{"2":{"34":9,"48":1}}],["aarch64",{"2":{"21":1,"40":4,"41":1}}],["apache",{"2":{"91":1,"92":1,"93":1}}],["apt",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1}}],["app",{"2":{"12":5,"33":1,"34":10,"63":1}}],["appmethod",{"2":{"9":1,"12":2}}],["attr",{"2":{"9":1,"12":1,"34":2,"48":3}}],["a",{"2":{"7":1}}],["button",{"2":{"95":1}}],["bus",{"2":{"95":1}}],["btn",{"2":{"48":1,"126":1}}],["bool",{"2":{"34":4,"87":2}}],["bin",{"2":{"34":1,"91":1,"92":1,"93":1}}],["basemethod",{"2":{"126":2}}],["baselog",{"2":{"91":2,"92":2,"93":2}}],["base",{"2":{"33":1,"63":1,"91":6,"108":2,"124":2,"126":1,"127":1,"128":2}}],["basecase",{"2":{"33":3,"127":2,"128":5}}],["bashcd",{"2":{"57":1}}],["bashmkdir",{"2":{"57":1}}],["bashmy",{"2":{"15":1,"18":1}}],["bashpip",{"2":{"56":6}}],["bashpython3",{"2":{"42":1}}],["bash$",{"2":{"52":1,"59":2,"61":2,"62":4,"63":2,"64":2,"65":2,"66":2,"67":6,"72":3,"75":2}}],["bash",{"2":{"46":1}}],["bashyouqu3",{"2":{"16":2,"19":2,"46":1,"49":2,"50":1,"51":1}}],["bash>>",{"2":{"12":1}}],["bar",{"2":{"3":1,"6":1}}],["by",{"2":{"9":1,"12":1,"34":6,"48":3}}],["because",{"2":{"7":1}}],["警告信息",{"2":{"7":1}}],["收集器节点的列表",{"2":{"5":1}}],["source",{"2":{"76":1,"88":1}}],["software",{"2":{"34":1,"91":2,"92":2,"93":2}}],["smoke",{"2":{"63":4,"65":2}}],["slaves",{"2":{"46":3}}],["slaves对象提供远程机器信息",{"0":{"46":1}}],["sleep",{"2":{"21":3}}],["systemctl",{"2":{"72":1}}],["system",{"2":{"40":1}}],["s",{"2":{"40":1}}],["skipif",{"2":{"40":8,"41":6}}],["skiped",{"2":{"39":1}}],["skip",{"2":{"36":1,"38":1,"39":2,"42":3,"43":1}}],["skipped",{"2":{"4":1}}],["similarity=similarity",{"2":{"34":2}}],["similarity=0",{"2":{"34":2,"87":1}}],["similarity",{"2":{"34":1,"87":1}}],["screen",{"2":{"34":8}}],["spdx",{"2":{"34":2,"91":2,"92":2,"93":2}}],["ssh",{"2":{"27":1,"72":3}}],["sw64",{"2":{"40":4}}],["sw",{"2":{"21":1}}],["sudo权限执行",{"0":{"26":1,"30":1}}],["sudo",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1,"40":1,"72":1}}],["summary",{"0":{"4":1},"2":{"2":2}}],["shell$",{"2":{"123":1}}],["shellpip",{"2":{"101":1}}],["shelluos",{"2":{"99":1,"108":1}}],["shellocr",{"2":{"87":1}}],["shellautotest",{"2":{"63":1,"124":1}}],["shell",{"0":{"52":1},"2":{"16":1,"19":1,"50":1,"52":2}}],["str",{"2":{"34":6}}],["step",{"2":{"12":1}}],["static",{"2":{"91":4,"92":2,"124":1,"129":1}}],["staticmethod",{"2":{"34":14,"91":2,"92":1}}],["status",{"2":{"34":2,"127":1}}],["start",{"2":{"15":2,"16":3,"18":1}}],["startswith",{"2":{"11":1,"94":2}}],["stage",{"2":{"6":3}}],["server",{"2":{"78":1,"79":8,"83":1}}],["secret",{"2":{"27":1}}],["setting",{"2":{"11":5,"34":6,"79":2,"83":3,"91":2,"92":2,"93":2,"94":6,"119":2}}],["setattr",{"2":{"10":1}}],["setup",{"2":{"6":1}}],["self",{"2":{"9":1,"12":1,"33":3,"48":4,"62":2,"91":8,"126":1,"127":2,"128":1}}],["fr",{"2":{"87":1}}],["from",{"2":{"12":2,"33":3,"34":17,"48":2,"79":2,"83":1,"91":3,"92":3,"93":3,"109":1,"126":2,"127":2,"128":3}}],["false",{"2":{"34":11,"41":2}}],["fail",{"2":{"6":2}}],["failed",{"2":{"4":1,"6":1}}],["float",{"2":{"34":13,"87":1}}],["fixture",{"2":{"124":1}}],["fixed",{"2":{"36":1,"42":3,"43":1}}],["filter",{"2":{"34":2}}],["file",{"2":{"34":14,"48":2,"94":2,"99":2,"100":2,"101":1,"108":2,"109":1,"126":1,"127":2}}],["filecopyrighttext",{"2":{"34":1,"91":1,"92":1,"93":1}}],["first=true",{"2":{"87":2}}],["first=return",{"2":{"34":2}}],["first=false",{"2":{"34":2}}],["first",{"2":{"34":3,"87":1}}],["find",{"2":{"12":4,"34":6}}],["f",{"2":{"12":1,"34":34,"67":6}}],["funnylog2",{"2":{"95":1}}],["funnylog",{"0":{"88":1},"1":{"89":1,"90":1,"91":1,"92":1,"93":1,"94":1},"2":{"11":1,"88":1,"89":1,"91":3,"92":3,"93":3,"94":3}}],["func",{"2":{"10":1}}],["foo0",{"2":{"6":1}}],["foo",{"2":{"3":1,"6":3,"7":2}}],["汇总信息",{"2":{"4":1}}],["2024",{"2":{"111":1}}],["2021",{"2":{"111":1}}],["2023",{"2":{"34":1,"91":1,"92":1,"93":1,"111":1}}],["28",{"2":{"12":1}}],["22",{"2":{"3":1}}],["2",{"0":{"40":1,"80":1,"83":1,"84":2,"85":1,"86":1,"87":1,"92":1,"98":1,"99":1,"100":2,"107":1,"108":1,"109":2,"112":1,"115":1,"119":1,"125":1,"126":1,"127":2,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1},"1":{"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"99":1,"100":1,"108":1,"109":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"135":1,"136":1,"137":1},"2":{"3":1,"4":2,"21":3,"34":1,"37":1,"46":2,"62":1,"74":1,"75":2,"95":1,"111":2,"124":1}}],["55",{"2":{"48":1}}],["50",{"2":{"6":1,"75":1}}],["5",{"0":{"87":1,"103":1,"122":1,"130":1,"134":1},"1":{"135":1,"136":1,"137":1},"2":{"3":2,"21":3,"95":1,"111":1}}],["56",{"2":{"3":1}}],["wdotool",{"2":{"95":1}}],["w5821",{"2":{"40":1}}],["widget",{"2":{"34":18,"48":1}}],["with",{"2":{"3":1}}],["web",{"2":{"54":1,"95":2,"135":1}}],["webassert",{"2":{"33":2}}],["webui",{"2":{"33":1,"56":2}}],["wayland",{"2":{"40":1,"41":1,"95":1}}],["want",{"2":{"16":1,"19":1}}],["warnings",{"0":{"7":1},"2":{"2":2}}],["what",{"2":{"16":1,"19":1}}],["x11",{"2":{"40":1}}],["xdg",{"2":{"40":1,"41":1}}],["xdist",{"2":{"3":1}}],["x3c",{"2":{"34":19}}],["x",{"2":{"12":2,"34":4}}],["xxx",{"2":{"9":1,"11":3,"12":1,"33":1,"36":3,"39":1,"42":2,"62":7,"94":1}}],["xxxx",{"2":{"0":1}}],["xpassed",{"2":{"4":1}}],["xfailed",{"2":{"4":1}}],["x86",{"2":{"3":1,"12":1,"40":2}}],["9",{"2":{"3":1,"12":2,"95":1}}],["7",{"0":{"132":1},"2":{"48":1,"95":1}}],["78",{"2":{"3":1}}],["7981803",{"2":{"2":1}}],["40",{"2":{"34":6}}],["47",{"2":{"12":1}}],["48",{"2":{"12":1}}],["4",{"0":{"86":1,"102":1,"117":1,"118":1,"119":1,"120":1,"121":2,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":2,"130":1,"131":1,"132":1,"133":1},"1":{"118":1,"119":1,"120":1,"121":1,"122":1,"124":1,"125":1,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"133":2,"135":1,"136":1,"137":1},"2":{"3":3,"95":1}}],["679537",{"2":{"39":1,"42":1,"43":1}}],["64",{"2":{"3":1,"12":1,"21":2,"40":2}}],["6",{"0":{"104":1,"131":1},"2":{"3":2,"12":1,"34":2,"87":1,"95":1}}],["3",{"0":{"41":1,"85":1,"93":1,"101":1,"113":1,"114":1,"115":1,"116":2,"117":1,"118":1,"119":1,"120":2,"121":1,"122":1,"128":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":2,"119":2,"120":2,"121":2,"122":2},"2":{"3":2,"4":1,"95":1}}],["public",{"0":{"104":1},"2":{"104":4}}],["pr",{"2":{"102":2}}],["project",{"2":{"48":2}}],["product",{"2":{"40":1}}],["process",{"2":{"34":4,"127":1}}],["popmethod",{"2":{"126":1}}],["po",{"2":{"100":1,"114":1,"126":1}}],["port",{"2":{"79":1,"83":1}}],["pms",{"2":{"95":2}}],["pdocr",{"0":{"76":1},"1":{"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1},"2":{"76":1,"78":1,"79":3,"81":1,"83":2,"95":1}}],["pip",{"2":{"56":1,"101":1}}],["picture",{"2":{"34":13,"84":1,"86":1}}],["pic",{"2":{"12":1,"34":14}}],["png",{"2":{"12":2,"34":4,"84":2,"86":1}}],["playwright",{"2":{"95":2}}],["platform",{"2":{"3":1,"40":5,"41":1}}],["plugins",{"2":{"3":1}}],["pluggy",{"2":{"3":1}}],["pypi",{"2":{"101":1}}],["pydbussend",{"2":{"95":1}}],["pylinuxauto",{"2":{"34":14,"95":1,"109":1}}],["py",{"2":{"3":1,"6":2,"7":2,"12":2,"15":2,"16":1,"18":2,"19":1,"33":3,"37":2,"41":2,"42":1,"48":1,"62":2,"63":4,"64":2,"67":6,"79":2,"91":1,"92":1,"93":1,"99":6,"108":12,"124":11,"126":1,"127":1,"128":4}}],["pytest",{"2":{"3":1,"38":1,"65":2,"95":3,"108":1}}],["pythonocr",{"2":{"84":1,"85":1,"86":1,"87":3}}],["python3",{"2":{"16":1,"19":1,"34":1,"91":1,"92":1,"93":1}}],["pythondfmwidget",{"2":{"12":1}}],["pythonfrom",{"2":{"11":1,"21":2,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"79":1,"83":1,"94":3,"100":1,"101":1,"109":1}}],["pythonclass",{"2":{"9":1,"33":1}}],["python",{"2":{"3":1,"12":2,"33":2,"34":1,"48":1,"62":1,"79":1,"112":1,"114":1,"126":1,"127":1,"128":3}}],["paddleocr",{"2":{"76":1}}],["pause=pause",{"2":{"34":4}}],["pause",{"2":{"34":8}}],["pass",{"2":{"34":4}}],["password=",{"2":{"48":1}}],["password=password",{"2":{"48":1}}],["password2",{"2":{"46":1}}],["password1",{"2":{"46":2}}],["password",{"2":{"27":1,"29":1,"30":1,"31":1,"48":1}}],["passed",{"2":{"4":1}}],["param",{"2":{"12":2,"34":32}}],["packages",{"2":{"3":1}}],["path",{"2":{"2":1,"7":2,"12":1,"34":17,"48":1,"94":2}}],["cd",{"2":{"112":1}}],["ci",{"2":{"112":1}}],["center",{"2":{"95":1}}],["c",{"2":{"75":2}}],["cpu",{"2":{"40":3}}],["csv文件",{"2":{"37":1}}],["csv文件与脚本对应关系",{"0":{"37":1}}],["csv",{"2":{"36":1,"37":6,"38":2,"39":1,"40":1,"44":1,"65":1,"108":2,"124":1,"130":2}}],["ch",{"2":{"34":2,"87":2}}],["cmd",{"2":{"25":3,"26":3,"27":3,"29":1,"30":1,"31":1,"34":4}}],["cli",{"2":{"111":1}}],["click",{"2":{"9":1,"12":1,"48":3,"126":2,"127":1}}],["clone",{"2":{"16":1,"19":1}}],["cls",{"2":{"12":2,"34":1,"91":4}}],["classmethod",{"2":{"12":1,"34":1,"91":2}}],["class",{"2":{"7":1,"11":3,"12":2,"33":2,"34":1,"48":1,"62":1,"91":3,"92":3,"93":3,"94":4,"126":1,"127":1,"128":3}}],["cargo",{"0":{"51":1},"2":{"50":1,"51":2,"59":1,"61":1,"62":2,"63":1,"64":1,"65":1,"66":1,"67":3,"72":1,"75":1}}],["cache",{"2":{"34":5}}],["case",{"2":{"15":2,"18":2,"33":2,"63":2,"64":1,"67":8,"108":3,"109":1,"124":4,"126":1,"127":3,"128":3}}],["cannot",{"2":{"7":1}}],["call",{"2":{"6":1}}],["c1",{"2":{"7":1}}],["commit",{"2":{"95":2}}],["com",{"2":{"76":1,"88":1}}],["count",{"2":{"34":1}}],["co",{"2":{"34":1,"91":1,"92":1,"93":1}}],["coding",{"2":{"34":1,"91":1,"92":1,"93":1}}],["code",{"2":{"7":1,"76":1,"88":1}}],["consolepip",{"2":{"78":1,"81":1,"89":1}}],["constructor",{"2":{"7":1}}],["contain",{"2":{"11":1,"94":1}}],["conftest",{"2":{"124":1}}],["config",{"2":{"12":1,"48":2,"108":1,"124":1}}],["conf",{"2":{"11":1,"79":1,"83":1,"91":1,"92":1,"93":1,"94":3}}],["collect",{"2":{"7":1}}],["collected",{"2":{"4":1}}],["collectors",{"0":{"5":1},"2":{"2":2}}],["created",{"2":{"2":1}}],["e",{"2":{"72":2}}],["equal",{"2":{"34":2}}],["ele",{"2":{"126":1}}],["elementnotfound",{"2":{"34":1}}],["element",{"2":{"12":2,"34":8,"48":1}}],["elements",{"2":{"12":5}}],["elif",{"2":{"34":4}}],["else",{"2":{"34":8}}],["events=",{"2":{"27":1}}],["expr=",{"2":{"34":2}}],["expr",{"2":{"34":10}}],["expanduser",{"2":{"34":2}}],["expect",{"2":{"27":1,"31":1,"34":18}}],["expect交互",{"0":{"27":1,"31":1}}],["excel",{"2":{"44":1}}],["exception",{"2":{"34":6}}],["exceptions",{"2":{"34":13}}],["except",{"2":{"34":8}}],["exc",{"2":{"34":12}}],["exists",{"2":{"34":2}}],["exist",{"2":{"34":11}}],["exitcode",{"2":{"2":1}}],["en",{"2":{"87":1}}],["envx",{"2":{"50":2}}],["env",{"2":{"34":1,"91":1,"92":1,"93":1,"108":1,"124":1}}],["environment",{"0":{"3":1},"2":{"2":2}}],["end",{"2":{"18":1,"19":3}}],["endswith",{"2":{"11":1,"91":1,"92":1,"93":1,"94":1}}],["error",{"2":{"4":1,"11":1,"92":2,"93":2}}],["titlemethod",{"2":{"126":1}}],["timeout=timeout",{"2":{"34":4}}],["timeout",{"2":{"34":5}}],["time",{"2":{"21":1,"34":4}}],["tmp",{"2":{"94":1}}],["t",{"2":{"65":2,"66":2}}],["type",{"2":{"40":1,"41":1}}],["typing",{"2":{"34":1}}],["tags",{"0":{"69":1},"2":{"37":1,"68":1,"69":3}}],["txt",{"0":{"69":1,"70":1},"2":{"34":3,"68":3,"69":3,"74":1,"108":1,"124":1}}],["transfer",{"2":{"95":1}}],["trace",{"2":{"10":2}}],["true表示返回原始数据",{"2":{"87":1}}],["true",{"2":{"34":4,"41":2,"127":1}}],["try",{"2":{"34":4}}],["tuple",{"2":{"12":1,"34":2,"94":1}}],["templateelementfound",{"2":{"34":3}}],["templateelementnotfound",{"2":{"34":5}}],["technology",{"2":{"34":1,"91":1,"92":1,"93":1}}],["teardown",{"2":{"6":1}}],["testlog",{"2":{"91":7,"92":2,"93":1}}],["testmusic",{"2":{"64":1}}],["testmycase",{"2":{"33":1,"127":1}}],["testcase",{"2":{"62":1,"128":1}}],["testfoo",{"2":{"7":2}}],["test",{"2":{"6":8,"7":3,"33":1,"37":2,"62":7,"63":2,"64":2,"67":6,"84":2,"86":1,"94":1,"108":2,"124":2,"127":2,"128":2}}],["tests",{"0":{"6":1},"2":{"2":3,"7":1,"99":1}}],["toolkit",{"2":{"97":1,"99":1}}],["todo",{"2":{"31":1}}],["total",{"2":{"4":1}}],["to",{"2":{"2":1,"7":1}}],["rightmethod",{"2":{"126":1}}],["rm",{"0":{"53":1},"2":{"50":1,"53":1}}],["rpcgui",{"0":{"48":1},"2":{"48":2}}],["rpc",{"0":{"76":1},"1":{"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1},"2":{"45":2,"48":1,"76":2,"78":1,"79":3,"81":1,"83":2,"95":4}}],["raise",{"2":{"34":22}}],["rate=rate",{"2":{"34":2}}],["rate=0",{"2":{"12":1}}],["rate",{"2":{"12":1,"34":7}}],["run",{"2":{"16":2,"19":2,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"42":1,"46":1,"49":1,"51":1,"52":1,"59":3,"61":2,"62":4,"63":2,"64":2,"65":2,"66":2,"67":6}}],["requirements",{"2":{"108":1,"124":1}}],["readme",{"2":{"99":1,"108":1}}],["record",{"2":{"95":1}}],["recursive",{"2":{"34":1}}],["removed",{"2":{"36":1,"43":2}}],["remotemethod",{"2":{"48":2}}],["remote",{"2":{"29":1,"30":1,"31":1,"48":1,"56":1,"72":3,"75":2}}],["remotecmd",{"2":{"29":2,"30":2,"31":2}}],["retry=network",{"2":{"34":4}}],["retry",{"2":{"34":9}}],["return",{"2":{"12":2,"34":6,"87":5}}],["restart",{"2":{"48":2,"72":1}}],["restart=false",{"2":{"48":1}}],["res",{"2":{"12":1,"34":21,"124":3,"129":3}}],["report",{"2":{"0":2,"95":1}}],["rootdir",{"2":{"48":1}}],["root",{"2":{"2":1,"46":3}}],["16",{"2":{"95":1}}],["168",{"2":{"46":3,"83":1}}],["15",{"2":{"95":1}}],["1518371686",{"2":{"2":1}}],["14",{"2":{"95":1}}],["13",{"2":{"95":1}}],["12",{"2":{"95":1}}],["1235666275024414",{"2":{"2":1}}],["11",{"2":{"95":1}}],["192",{"2":{"46":3,"83":1}}],["17",{"2":{"12":1,"95":1}}],["1071",{"2":{"101":1}}],["1070",{"2":{"101":1}}],["100",{"2":{"75":3}}],["10",{"2":{"4":2,"48":1,"95":1}}],["1",{"0":{"39":1,"77":1,"83":1,"91":1,"97":1,"99":1,"106":1,"108":1,"111":1,"114":1,"118":1,"124":1,"126":1},"1":{"78":1,"79":1},"2":{"2":1,"3":4,"4":3,"21":3,"34":7,"37":1,"46":5,"48":1,"62":3,"83":1,"87":1,"95":1,"111":1,"124":1}}],["002",{"2":{"63":1,"67":2,"124":1}}],["001",{"2":{"12":2,"33":2,"36":1,"37":2,"40":1,"62":7,"63":1,"64":5,"67":4,"108":2,"124":1,"127":2,"128":2}}],["02",{"2":{"12":1}}],["0",{"2":{"2":1,"3":4,"12":1,"34":1,"83":1,"111":2}}],["报告中",{"2":{"12":1}}],["报告内容",{"0":{"1":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1}}],["报告",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"2":{"0":1}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/@localSearchIndexroot.gI043LAz.js b/assets/chunks/@localSearchIndexroot.gI043LAz.js new file mode 100644 index 0000000..5d8d532 --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.gI043LAz.js @@ -0,0 +1 @@ +const t='{"documentCount":138,"nextId":138,"documentIds":{"0":"/youqu3/指南/与生俱来/JSON报告.html#json-报告","1":"/youqu3/指南/与生俱来/JSON报告.html#报告内容","2":"/youqu3/指南/与生俱来/JSON报告.html#整体结构","3":"/youqu3/指南/与生俱来/JSON报告.html#environment","4":"/youqu3/指南/与生俱来/JSON报告.html#summary","5":"/youqu3/指南/与生俱来/JSON报告.html#collectors","6":"/youqu3/指南/与生俱来/JSON报告.html#tests","7":"/youqu3/指南/与生俱来/JSON报告.html#warnings","8":"/youqu3/指南/与生俱来/全自动日志.html#全自动日志","9":"/youqu3/指南/与生俱来/全自动日志.html#背景","10":"/youqu3/指南/与生俱来/全自动日志.html#实现原理","11":"/youqu3/指南/与生俱来/全自动日志.html#日志配置","12":"/youqu3/指南/与生俱来/全自动日志.html#使用方法","13":"/youqu3/指南/与生俱来/前后钩子.html#前后钩子","14":"/youqu3/指南/与生俱来/前后钩子.html#前置钩子","15":"/youqu3/指南/与生俱来/前后钩子.html#前置脚本钩子","16":"/youqu3/指南/与生俱来/前后钩子.html#前置命令行入参钩子","17":"/youqu3/指南/与生俱来/前后钩子.html#后置钩子","18":"/youqu3/指南/与生俱来/前后钩子.html#后置脚本钩子","19":"/youqu3/指南/与生俱来/前后钩子.html#后置命令行入参钩子","20":"/youqu3/指南/与生俱来/动态等待.html#动态等待","21":"/youqu3/指南/与生俱来/动态等待.html#架构动态等待","22":"/youqu3/指南/与生俱来/动态等待.html#元素识别动态等待","23":"/youqu3/指南/与生俱来/命令行交互.html#命令行交互","24":"/youqu3/指南/与生俱来/命令行交互.html#本机命令行交互","25":"/youqu3/指南/与生俱来/命令行交互.html#普通权限执行","26":"/youqu3/指南/与生俱来/命令行交互.html#sudo权限执行","27":"/youqu3/指南/与生俱来/命令行交互.html#expect交互","28":"/youqu3/指南/与生俱来/命令行交互.html#远程命令行交互","29":"/youqu3/指南/与生俱来/命令行交互.html#普通权限执行-1","30":"/youqu3/指南/与生俱来/命令行交互.html#sudo权限执行-1","31":"/youqu3/指南/与生俱来/命令行交互.html#expect交互-1","32":"/youqu3/指南/与生俱来/断言语句.html#断言语句","33":"/youqu3/指南/与生俱来/断言语句.html#用例中使用方法","34":"/youqu3/指南/与生俱来/断言语句.html#方法明细","35":"/youqu3/指南/与生俱来/标签化管理.html#标签化管理","36":"/youqu3/指南/与生俱来/标签化管理.html#使用说明","37":"/youqu3/指南/与生俱来/标签化管理.html#csv文件与脚本对应关系","38":"/youqu3/指南/与生俱来/标签化管理.html#跳过用例","39":"/youqu3/指南/与生俱来/标签化管理.html#_1-固定跳过","40":"/youqu3/指南/与生俱来/标签化管理.html#_2-条件判断跳过","41":"/youqu3/指南/与生俱来/标签化管理.html#_3-自定义跳过","42":"/youqu3/指南/与生俱来/标签化管理.html#确认修复","43":"/youqu3/指南/与生俱来/标签化管理.html#废弃用例","44":"/youqu3/指南/与生俱来/标签化管理.html#文件格式","45":"/youqu3/指南/与生俱来/远程交互控制.html#远程交互式控制","46":"/youqu3/指南/与生俱来/远程交互控制.html#slaves对象提供远程机器信息","47":"/youqu3/指南/与生俱来/远程交互控制.html#ui操作远程对象","48":"/youqu3/指南/与生俱来/远程交互控制.html#rpcgui","49":"/youqu3/指南/环境管理/原生环境.html#原生环境","50":"/youqu3/指南/环境管理/虚拟环境.html#虚拟环境","51":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-cargo","52":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-shell","53":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-rm","54":"/youqu3/指南/简介/YouQu3是什么.html#youqu3-能做什么","55":"/youqu3/指南/简介/快速开始.html#快速开始","56":"/youqu3/指南/简介/快速开始.html#安装","57":"/youqu3/指南/简介/快速开始.html#创建用例工程","58":"/youqu3/指南/驱动执行/本地执行.html#本地执行","59":"/youqu3/指南/驱动执行/本地执行.html#子命令","60":"/youqu3/指南/驱动执行/本地执行.html#用例驱动方式","61":"/youqu3/指南/驱动执行/本地执行.html#执行所有用例","62":"/youqu3/指南/驱动执行/本地执行.html#指定执行某一个用例","63":"/youqu3/指南/驱动执行/本地执行.html#指定某个目录执行","64":"/youqu3/指南/驱动执行/本地执行.html#根据关键词执行","65":"/youqu3/指南/驱动执行/本地执行.html#根据标签执行","66":"/youqu3/指南/驱动执行/本地执行.html#批量用例id驱动执行","67":"/youqu3/指南/驱动执行/本地执行.html#指定用例文件路径执行","68":"/youqu3/指南/驱动执行/自定义执行.html#自定义执行","69":"/youqu3/指南/驱动执行/自定义执行.html#youqu-tags-txt","70":"/youqu3/指南/驱动执行/自定义执行.html#youqu-keywords-txt","71":"/youqu3/指南/驱动执行/远程执行.html#远程执行","72":"/youqu3/指南/驱动执行/远程执行.html#子命令","73":"/youqu3/指南/驱动执行/远程执行.html#远程测试机分组策略","74":"/youqu3/指南/驱动执行/远程执行.html#分组规则","75":"/youqu3/指南/驱动执行/远程执行.html#执行策略","76":"/youqu3/插件/OCR识别.html#pdocr-rpc","77":"/youqu3/插件/OCR识别.html#_1、服务端","78":"/youqu3/插件/OCR识别.html#服务端安装","79":"/youqu3/插件/OCR识别.html#服务端启动服务","80":"/youqu3/插件/OCR识别.html#_2、客户端","81":"/youqu3/插件/OCR识别.html#客户端安装","82":"/youqu3/插件/OCR识别.html#客户端使用","83":"/youqu3/插件/OCR识别.html#_2-1、识别当前屏幕的所有文字内容","84":"/youqu3/插件/OCR识别.html#_2-2、指定某张图片识别的所有文字内容","85":"/youqu3/插件/OCR识别.html#_2-3、在全屏指定查找某个字符串的坐标","86":"/youqu3/插件/OCR识别.html#_2-4、指定某张图片查找某个字符串的坐标","87":"/youqu3/插件/OCR识别.html#_2-5、其他参数","88":"/youqu3/插件/全自动日志.html#funnylog","89":"/youqu3/插件/全自动日志.html#安装","90":"/youqu3/插件/全自动日志.html#使用方法","91":"/youqu3/插件/全自动日志.html#_1、自动输出日志","92":"/youqu3/插件/全自动日志.html#_2、方法中输出其他的日志","93":"/youqu3/插件/全自动日志.html#_3、在外层其他直接使用","94":"/youqu3/插件/全自动日志.html#必要配置项","95":"/youqu3/插件/插件列表.html#youqu3-插件汇总信息","96":"/youqu3/规划/UOS自动化测试方法套件.html#uos-自动化测试方法套件-umtk","97":"/youqu3/规划/UOS自动化测试方法套件.html#_1-简介","98":"/youqu3/规划/UOS自动化测试方法套件.html#_2-工程设计","99":"/youqu3/规划/UOS自动化测试方法套件.html#_2-1-工程结构","100":"/youqu3/规划/UOS自动化测试方法套件.html#_2-2-方案说明","101":"/youqu3/规划/UOS自动化测试方法套件.html#_3-套件发布","102":"/youqu3/规划/UOS自动化测试方法套件.html#_4-套件维护","103":"/youqu3/规划/UOS自动化测试方法套件.html#_5-对套件的测试","104":"/youqu3/规划/UOS自动化测试方法套件.html#_6-umtk-和-youqu2-的公共方法库-public-有何区别","105":"/youqu3/规划/UOS自动化测试用例.html#uos-自动化测试用例","106":"/youqu3/规划/UOS自动化测试用例.html#_1-简介","107":"/youqu3/规划/UOS自动化测试用例.html#_2-工程设计","108":"/youqu3/规划/UOS自动化测试用例.html#_2-1-工程结构","109":"/youqu3/规划/UOS自动化测试用例.html#_2-2-方案说明","110":"/youqu3/规划/YouQu3架构设计规划.html#youqu3-架构设计规划","111":"/youqu3/规划/YouQu3架构设计规划.html#_1-背景","112":"/youqu3/规划/YouQu3架构设计规划.html#_2-目标","113":"/youqu3/规划/YouQu3架构设计规划.html#_3-架构设计","114":"/youqu3/规划/YouQu3架构设计规划.html#_3-1-总体方案","115":"/youqu3/规划/YouQu3架构设计规划.html#_3-2-架构设计","116":"/youqu3/规划/YouQu3架构设计规划.html#_3-3-整体数据流","117":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-详细设计","118":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-1-驱动执行管理","119":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-2-配置项管理","120":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-3-框架总线接口","121":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-4-按测试类型管理插件","122":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-5-环境依赖管理","123":"/youqu3/规划/YouQu3架构设计规划.html#_4-用例工程设计","124":"/youqu3/规划/YouQu3架构设计规划.html#_4-1-用例工程结构","125":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-各模块编写思路","126":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-1-方法层","127":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-2-用例层","128":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-3-断言","129":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-4-配置对象","130":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-5-用例标签管理文件","131":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-6-默认环境变量管理文件","132":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-7-依赖管理文件","133":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-8-调试用例驱动","134":"/youqu3/规划/YouQu3架构设计规划.html#_5-演进规划","135":"/youqu3/规划/YouQu3架构设计规划.html#可视化配置","136":"/youqu3/规划/YouQu3架构设计规划.html#非开发者下运行","137":"/youqu3/规划/YouQu3架构设计规划.html#过程钩子"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,8],"1":[1,2,1],"2":[1,3,23],"3":[1,3,31],"4":[1,3,15],"5":[1,3,4],"6":[1,3,21],"7":[1,3,23],"8":[1,1,1],"9":[1,1,41],"10":[1,1,24],"11":[1,1,27],"12":[1,1,102],"13":[1,1,3],"14":[1,1,1],"15":[1,2,11],"16":[1,2,24],"17":[1,1,1],"18":[1,2,12],"19":[1,2,24],"20":[1,1,1],"21":[1,1,21],"22":[1,1,1],"23":[1,1,1],"24":[1,1,1],"25":[1,2,8],"26":[1,2,11],"27":[1,2,18],"28":[1,1,1],"29":[1,2,13],"30":[1,2,15],"31":[1,2,17],"32":[1,1,4],"33":[1,1,35],"34":[1,1,255],"35":[1,1,1],"36":[1,1,13],"37":[1,1,50],"38":[1,1,14],"39":[2,2,18],"40":[2,2,62],"41":[2,2,41],"42":[1,1,33],"43":[1,1,21],"44":[1,1,8],"45":[1,1,13],"46":[1,1,21],"47":[1,1,1],"48":[1,2,57],"49":[1,1,11],"50":[1,1,22],"51":[2,1,6],"52":[2,1,12],"53":[2,1,4],"54":[3,1,18],"55":[1,1,1],"56":[1,1,18],"57":[1,1,9],"58":[1,1,1],"59":[1,1,7],"60":[1,1,1],"61":[1,2,6],"62":[1,2,21],"63":[1,2,25],"64":[1,2,30],"65":[1,2,24],"66":[1,2,15],"67":[1,2,21],"68":[1,1,8],"69":[3,1,14],"70":[3,1,1],"71":[1,1,1],"72":[1,1,19],"73":[1,1,1],"74":[1,2,17],"75":[1,2,32],"76":[2,1,18],"77":[2,2,1],"78":[1,4,6],"79":[1,4,22],"80":[2,2,1],"81":[1,4,5],"82":[1,4,1],"83":[3,5,21],"84":[2,5,11],"85":[3,5,8],"86":[3,5,10],"87":[3,5,39],"88":[1,1,12],"89":[1,1,4],"90":[1,1,1],"91":[2,2,61],"92":[2,2,58],"93":[2,2,49],"94":[1,1,37],"95":[2,1,90],"96":[4,1,1],"97":[2,4,18],"98":[2,4,1],"99":[3,5,20],"100":[2,5,21],"101":[2,4,33],"102":[2,4,8],"103":[2,4,9],"104":[7,4,50],"105":[2,1,1],"106":[2,2,12],"107":[2,2,1],"108":[3,4,29],"109":[2,4,24],"110":[2,1,1],"111":[2,2,56],"112":[2,2,46],"113":[2,2,1],"114":[3,4,37],"115":[3,4,1],"116":[2,4,15],"117":[3,4,2],"118":[4,6,16],"119":[4,6,19],"120":[3,6,12],"121":[3,6,4],"122":[4,6,5],"123":[2,2,5],"124":[3,4,49],"125":[3,4,2],"126":[4,6,53],"127":[3,6,32],"128":[4,6,30],"129":[3,6,13],"130":[4,6,9],"131":[4,6,4],"132":[4,6,2],"133":[4,6,5],"134":[2,2,1],"135":[1,7,6],"136":[1,7,4],"137":[1,7,5]},"averageFieldLength":[1.7536231884057978,2.5434782608695654,18.94927536231884],"storedFields":{"0":{"title":"JSON 报告","titles":[]},"1":{"title":"报告内容","titles":["JSON 报告"]},"2":{"title":"整体结构","titles":["JSON 报告","报告内容"]},"3":{"title":"Environment","titles":["JSON 报告","报告内容"]},"4":{"title":"Summary","titles":["JSON 报告","报告内容"]},"5":{"title":"Collectors","titles":["JSON 报告","报告内容"]},"6":{"title":"Tests","titles":["JSON 报告","报告内容"]},"7":{"title":"Warnings","titles":["JSON 报告","报告内容"]},"8":{"title":"全自动日志","titles":[]},"9":{"title":"背景","titles":["全自动日志"]},"10":{"title":"实现原理","titles":["全自动日志"]},"11":{"title":"日志配置","titles":["全自动日志"]},"12":{"title":"使用方法","titles":["全自动日志"]},"13":{"title":"前后钩子","titles":[]},"14":{"title":"前置钩子","titles":["前后钩子"]},"15":{"title":"前置脚本钩子","titles":["前后钩子","前置钩子"]},"16":{"title":"前置命令行入参钩子","titles":["前后钩子","前置钩子"]},"17":{"title":"后置钩子","titles":["前后钩子"]},"18":{"title":"后置脚本钩子","titles":["前后钩子","后置钩子"]},"19":{"title":"后置命令行入参钩子","titles":["前后钩子","后置钩子"]},"20":{"title":"动态等待","titles":[]},"21":{"title":"架构动态等待","titles":["动态等待"]},"22":{"title":"元素识别动态等待","titles":["动态等待"]},"23":{"title":"命令行交互","titles":[]},"24":{"title":"本机命令行交互","titles":["命令行交互"]},"25":{"title":"普通权限执行","titles":["命令行交互","本机命令行交互"]},"26":{"title":"sudo权限执行","titles":["命令行交互","本机命令行交互"]},"27":{"title":"expect交互","titles":["命令行交互","本机命令行交互"]},"28":{"title":"远程命令行交互","titles":["命令行交互"]},"29":{"title":"普通权限执行","titles":["命令行交互","远程命令行交互"]},"30":{"title":"sudo权限执行","titles":["命令行交互","远程命令行交互"]},"31":{"title":"expect交互","titles":["命令行交互","远程命令行交互"]},"32":{"title":"断言语句","titles":[]},"33":{"title":"用例中使用方法","titles":["断言语句"]},"34":{"title":"方法明细","titles":["断言语句"]},"35":{"title":"标签化管理","titles":[]},"36":{"title":"使用说明","titles":["标签化管理"]},"37":{"title":"CSV文件与脚本对应关系","titles":["标签化管理"]},"38":{"title":"跳过用例","titles":["标签化管理"]},"39":{"title":"1. 固定跳过","titles":["标签化管理","跳过用例"]},"40":{"title":"2. 条件判断跳过","titles":["标签化管理","跳过用例"]},"41":{"title":"3.自定义跳过","titles":["标签化管理","跳过用例"]},"42":{"title":"确认修复","titles":["标签化管理"]},"43":{"title":"废弃用例","titles":["标签化管理"]},"44":{"title":"文件格式","titles":["标签化管理"]},"45":{"title":"远程交互式控制","titles":[]},"46":{"title":"slaves对象提供远程机器信息","titles":["远程交互式控制"]},"47":{"title":"UI操作远程对象","titles":["远程交互式控制"]},"48":{"title":"RpcGui","titles":["远程交互式控制","UI操作远程对象"]},"49":{"title":"原生环境","titles":[]},"50":{"title":"虚拟环境","titles":[]},"51":{"title":"youqu3-cargo","titles":["虚拟环境"]},"52":{"title":"youqu3-shell","titles":["虚拟环境"]},"53":{"title":"youqu3-rm","titles":["虚拟环境"]},"54":{"title":"YouQu3 能做什么?","titles":[null]},"55":{"title":"快速开始","titles":[]},"56":{"title":"安装","titles":["快速开始"]},"57":{"title":"创建用例工程","titles":["快速开始"]},"58":{"title":"本地执行","titles":[]},"59":{"title":"子命令","titles":["本地执行"]},"60":{"title":"用例驱动方式","titles":["本地执行"]},"61":{"title":"执行所有用例","titles":["本地执行","用例驱动方式"]},"62":{"title":"指定执行某一个用例","titles":["本地执行","用例驱动方式"]},"63":{"title":"指定某个目录执行","titles":["本地执行","用例驱动方式"]},"64":{"title":"根据关键词执行","titles":["本地执行","用例驱动方式"]},"65":{"title":"根据标签执行","titles":["本地执行","用例驱动方式"]},"66":{"title":"批量用例ID驱动执行","titles":["本地执行","用例驱动方式"]},"67":{"title":"指定用例文件路径执行","titles":["本地执行","用例驱动方式"]},"68":{"title":"自定义执行","titles":[]},"69":{"title":"youqu-tags.txt","titles":["自定义执行"]},"70":{"title":"youqu-keywords.txt","titles":["自定义执行"]},"71":{"title":"远程执行","titles":[]},"72":{"title":"子命令","titles":["远程执行"]},"73":{"title":"远程测试机分组策略","titles":["远程执行"]},"74":{"title":"分组规则","titles":["远程执行","远程测试机分组策略"]},"75":{"title":"执行策略","titles":["远程执行","远程测试机分组策略"]},"76":{"title":"pdocr-rpc","titles":[]},"77":{"title":"1、服务端","titles":["pdocr-rpc"]},"78":{"title":"服务端安装","titles":["pdocr-rpc","1、服务端"]},"79":{"title":"服务端启动服务","titles":["pdocr-rpc","1、服务端"]},"80":{"title":"2、客户端","titles":["pdocr-rpc"]},"81":{"title":"客户端安装","titles":["pdocr-rpc","2、客户端"]},"82":{"title":"客户端使用","titles":["pdocr-rpc","2、客户端"]},"83":{"title":"2.1、识别当前屏幕的所有文字内容","titles":["pdocr-rpc","2、客户端","客户端使用"]},"84":{"title":"2.2、指定某张图片识别的所有文字内容","titles":["pdocr-rpc","2、客户端","客户端使用"]},"85":{"title":"2.3、在全屏指定查找某个字符串的坐标","titles":["pdocr-rpc","2、客户端","客户端使用"]},"86":{"title":"2.4、指定某张图片查找某个字符串的坐标","titles":["pdocr-rpc","2、客户端","客户端使用"]},"87":{"title":"2.5、其他参数","titles":["pdocr-rpc","2、客户端","客户端使用"]},"88":{"title":"FunnyLog","titles":[]},"89":{"title":"安装","titles":["FunnyLog"]},"90":{"title":"使用方法","titles":["FunnyLog"]},"91":{"title":"1、自动输出日志","titles":["FunnyLog","使用方法"]},"92":{"title":"2、方法中输出其他的日志","titles":["FunnyLog","使用方法"]},"93":{"title":"3、在外层其他直接使用","titles":["FunnyLog","使用方法"]},"94":{"title":"必要配置项","titles":["FunnyLog"]},"95":{"title":"YouQu3 插件汇总信息","titles":[null]},"96":{"title":"UOS 自动化测试方法套件(UMTK)","titles":[]},"97":{"title":"1. 简介","titles":["UOS 自动化测试方法套件(UMTK)"]},"98":{"title":"2. 工程设计","titles":["UOS 自动化测试方法套件(UMTK)"]},"99":{"title":"2.1. 工程结构","titles":["UOS 自动化测试方法套件(UMTK)","2. 工程设计"]},"100":{"title":"2.2. 方案说明","titles":["UOS 自动化测试方法套件(UMTK)","2. 工程设计"]},"101":{"title":"3. 套件发布","titles":["UOS 自动化测试方法套件(UMTK)"]},"102":{"title":"4. 套件维护","titles":["UOS 自动化测试方法套件(UMTK)"]},"103":{"title":"5. 对套件的测试","titles":["UOS 自动化测试方法套件(UMTK)"]},"104":{"title":"6. UMTK 和 YouQu2 的公共方法库(public)有何区别","titles":["UOS 自动化测试方法套件(UMTK)"]},"105":{"title":"UOS 自动化测试用例","titles":[]},"106":{"title":"1. 简介","titles":["UOS 自动化测试用例"]},"107":{"title":"2. 工程设计","titles":["UOS 自动化测试用例"]},"108":{"title":"2.1. 工程结构","titles":["UOS 自动化测试用例","2. 工程设计"]},"109":{"title":"2.2. 方案说明","titles":["UOS 自动化测试用例","2. 工程设计"]},"110":{"title":"YouQu3 架构设计规划","titles":[]},"111":{"title":"1. 背景","titles":["YouQu3 架构设计规划"]},"112":{"title":"2. 目标","titles":["YouQu3 架构设计规划"]},"113":{"title":"3. 架构设计","titles":["YouQu3 架构设计规划"]},"114":{"title":"3.1. 总体方案","titles":["YouQu3 架构设计规划","3. 架构设计"]},"115":{"title":"3.2. 架构设计","titles":["YouQu3 架构设计规划","3. 架构设计"]},"116":{"title":"3.3. 整体数据流","titles":["YouQu3 架构设计规划","3. 架构设计"]},"117":{"title":"3.4. 详细设计","titles":["YouQu3 架构设计规划","3. 架构设计"]},"118":{"title":"3.4.1. 驱动执行管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"119":{"title":"3.4.2. 配置项管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"120":{"title":"3.4.3. 框架总线接口","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"121":{"title":"3.4.4. 按测试类型管理插件","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"122":{"title":"3.4.5. 环境依赖管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"123":{"title":"4. 用例工程设计","titles":["YouQu3 架构设计规划"]},"124":{"title":"4.1. 用例工程结构","titles":["YouQu3 架构设计规划","4. 用例工程设计"]},"125":{"title":"4.2. 各模块编写思路","titles":["YouQu3 架构设计规划","4. 用例工程设计"]},"126":{"title":"4.2.1. 方法层","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"127":{"title":"4.2.2. 用例层","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"128":{"title":"4.2.3. 断言","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"129":{"title":"4.2.4. 配置对象","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"130":{"title":"4.2.5. 用例标签管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"131":{"title":"4.2.6. 默认环境变量管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"132":{"title":"4.2.7. 依赖管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"133":{"title":"4.2.8. 调试用例驱动","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"134":{"title":"5. 演进规划","titles":["YouQu3 架构设计规划"]},"135":{"title":"可视化配置","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]},"136":{"title":"非开发者下运行","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]},"137":{"title":"过程钩子","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]}},"dirtCount":0,"index":[["即可自动被框架加载并执行",{"2":{"137":1}}],["即默认返回识别到字符串的中心坐标",{"2":{"87":1}}],["过程钩子",{"0":{"137":1}}],["过程中如果根据需要出小版本",{"2":{"101":1}}],["减少系统自动化环境准备的难度",{"2":{"136":1}}],["非开发者下运行",{"0":{"136":1}}],["配合远程执行功能",{"2":{"135":1}}],["配置对象",{"0":{"129":1}}],["配置模块",{"2":{"124":1}}],["配置文件管理配置项",{"2":{"119":1}}],["配置类",{"2":{"119":1,"129":1}}],["配置项管理",{"0":{"119":1},"2":{"119":1}}],["页面化的配置功能",{"2":{"135":1}}],["演进规划",{"0":{"134":1},"1":{"135":1,"136":1,"137":1}}],["模式运行脚本",{"2":{"133":1}}],["模块",{"2":{"118":1}}],["模块化改造",{"2":{"112":1}}],["模块名称为应用包名",{"2":{"100":1,"109":1}}],["模块名称",{"2":{"64":1}}],["定义用例工程所需要的依赖包",{"2":{"132":1}}],["定义虚拟环境相关的一些环境变量",{"2":{"131":1}}],["运行的行为",{"2":{"131":1}}],["运行稳定性",{"2":{"112":1}}],["日常维护过程中",{"2":{"130":1}}],["日志文件的生成路径",{"2":{"94":1}}],["日志",{"2":{"92":3}}],["日志模板语法",{"2":{"12":1}}],["日志配置",{"0":{"11":1}}],["维护标签时",{"2":{"130":1}}],["维护方法的稳定性有效性将成为一个问题",{"2":{"103":1}}],["然后",{"2":{"128":1}}],["然后将这些基础能力通过",{"2":{"45":1}}],["任务栏点击文件管理器",{"2":{"126":1}}],["\\t\\tself",{"2":{"128":1}}],["\\t",{"2":{"126":1}}],["\\tdef",{"2":{"126":1}}],["弹窗",{"2":{"126":1}}],["左边视图区域",{"2":{"126":1}}],["右边视图区域",{"2":{"126":1}}],["标题栏",{"2":{"126":1}}],["标签驱动",{"2":{"114":1}}],["标签驱动支持",{"2":{"65":1}}],["标签",{"2":{"65":1}}],["标签记录为",{"2":{"40":1}}],["标签可以无序",{"2":{"37":1}}],["标签化管理",{"0":{"35":1},"1":{"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1}}],["进行编写",{"2":{"126":1}}],["进行分割",{"2":{"41":1}}],["按照",{"2":{"126":1}}],["按测试类型管理插件",{"0":{"121":1}}],["放置在对应的类里面",{"2":{"126":1}}],["设计思想",{"2":{"126":1}}],["设计模式",{"2":{"100":1,"114":1}}],["依赖管理文件",{"0":{"132":1},"2":{"124":1}}],["调试用例驱动",{"0":{"133":1}}],["调试用例驱动脚本",{"2":{"124":1}}],["调用所有的断言语句",{"2":{"33":1}}],["调用方法时",{"2":{"12":1}}],["图像识别方法所需要的资源",{"2":{"124":1}}],["图片路径",{"2":{"34":2}}],["上层用例就能通过框架动态调用插件提供的功能",{"2":{"120":1}}],["插槽",{"2":{"120":1}}],["插件如果已经安装",{"2":{"120":1}}],["插件",{"2":{"116":1}}],["插件汇总信息",{"0":{"95":1}}],["原则上不通过修改配置文件的方式修改",{"2":{"119":1}}],["原生环境虚拟环境",{"2":{"59":1,"61":1,"62":2,"63":1,"64":1,"65":1,"66":1,"67":3,"72":1,"75":1}}],["原生环境",{"0":{"49":1}}],["公共配置为框架提供的一些具有默认值的配置项",{"2":{"119":1}}],["公共配置的形式",{"2":{"119":1}}],["显示的传入参数值",{"2":{"119":1}}],["采用虚拟环境管理依赖项",{"2":{"122":1}}],["采用命令行参数",{"2":{"119":1}}],["采用全新的架构设计",{"2":{"104":1}}],["解析测试策略",{"2":{"118":1}}],["解除跳过时将装饰器代码删掉",{"2":{"38":1}}],["获取命令行参数并结合配置项",{"2":{"118":1}}],["获取被装饰的类下所有函数",{"2":{"10":1}}],["驱动",{"2":{"118":1}}],["驱动命令将命令行参数传递给框架底层",{"2":{"118":1}}],["驱动执行管理",{"0":{"118":1}}],["驱动执行",{"2":{"63":1}}],["详细介绍各功能模块的设计和编写思路",{"2":{"125":1}}],["详细描述各模块工作方式",{"2":{"117":1}}],["详细设计",{"0":{"117":1},"1":{"118":1,"119":1,"120":1,"121":1,"122":1}}],["抛异常程序终止",{"2":{"116":1}}],["否则提示用户进行安装",{"2":{"116":1}}],["否则会提示无法连接",{"2":{"72":1}}],["底层功能",{"2":{"116":1}}],["让用户能专注于用例逻辑的编写和维护",{"2":{"114":1}}],["管理",{"2":{"114":1}}],["资源目录",{"2":{"114":1}}],["生成的用例工程遵循完整的",{"2":{"114":1}}],["三方包的形式提供",{"2":{"114":1}}],["由用例层决定使用哪些功能对应安装哪些插件",{"2":{"114":1}}],["由于虚拟环境中也安装了",{"2":{"52":1}}],["由于需求变更",{"2":{"43":1}}],["总体方案",{"0":{"114":1}}],["互不影响",{"2":{"112":1}}],["提高",{"2":{"112":1}}],["提高用例开发效率",{"2":{"112":1}}],["提供一个",{"2":{"135":1}}],["提供可调用的配置对象config",{"2":{"124":1}}],["提供的一个全局对象",{"2":{"46":1}}],["提供灵活的前后钩子机制",{"2":{"13":1}}],["安全性稳定性更好",{"2":{"112":1}}],["安装",{"0":{"56":1,"89":1},"2":{"101":1}}],["降低使用门槛",{"2":{"112":1}}],["价值",{"2":{"112":1}}],["简化系统环境部署",{"2":{"112":1}}],["简介",{"0":{"97":1,"106":1}}],["搭配远程执行功能",{"2":{"112":1}}],["功能插件可插拔",{"2":{"114":1}}],["功能扩展性更好",{"2":{"112":1}}],["功能可插拔",{"2":{"112":1}}],["功能强大的自动化测试框架",{"2":{"111":1}}],["功能强大的日志工具",{"2":{"88":1}}],["极致轻量化",{"2":{"112":1}}],["诸多亮点功能的同时解决其遇到的问题",{"2":{"112":1}}],["扩展性和兼容性更好的自动化测试框架",{"2":{"111":1}}],["更贴合大部分真实用户的使用场景",{"2":{"136":1}}],["更新",{"2":{"112":1}}],["更加纯粹",{"2":{"111":1}}],["更重要的是我们不想引入三方依赖",{"2":{"44":1}}],["甚至有些问题在现有框架结构下根本无法解决",{"2":{"111":1}}],["业务流程有一些影响",{"2":{"111":1}}],["业务不同",{"2":{"104":1}}],["势必对现有公司自动化用例",{"2":{"111":1}}],["等等",{"2":{"111":1}}],["绑定了太多公司的业务",{"2":{"111":1}}],["导致框架代码容易被用户修改",{"2":{"111":1}}],["源代码暴露在用户面前",{"2":{"111":1}}],["每次使用需要初始化框架工程及单独做环境部署",{"2":{"111":1}}],["每个应用存在一个唯一的出口文件",{"2":{"100":1}}],["每个机器执行",{"2":{"75":1}}],["每个模块建立一个",{"2":{"37":1}}],["每个用例的详细结果",{"2":{"6":1}}],["仍然存在一些不尽人意的地方",{"2":{"111":1}}],["小版本更新了数十个",{"2":{"111":1}}],["两个大版本",{"2":{"111":1}}],["两对大括号中的内容",{"2":{"12":1}}],["月在欧拉社区开源",{"2":{"111":1}}],["月正式在",{"2":{"111":1}}],["社区开源",{"2":{"111":1}}],["年",{"2":{"111":2}}],["年多的持续开发优化",{"2":{"111":1}}],["年成都测试团队开始内部孵化的项目",{"2":{"111":1}}],["经过了",{"2":{"111":1}}],["旨在成为下一代",{"2":{"112":1}}],["旨在开发一个简单易用",{"2":{"111":1}}],["旨在提供",{"2":{"106":1}}],["旨在提供系统预装应用所有的元素的操作方法",{"2":{"97":1}}],["做复杂步骤的封装",{"2":{"109":1}}],["里面导入使用",{"2":{"109":1}}],["里面的静态方法",{"2":{"91":2,"92":1}}],["里面的类方法",{"2":{"91":2}}],["里面的实例方法",{"2":{"91":2}}],["编写的",{"2":{"106":1}}],["大量人员都可以对其进行直接修改",{"2":{"104":1}}],["稳定性",{"2":{"104":2}}],["确保操作方法的一致性",{"2":{"104":1}}],["确认修复",{"0":{"42":1},"2":{"36":1,"37":1,"42":3,"43":1}}],["代码一致性",{"2":{"104":1}}],["代表不跳过",{"2":{"41":1}}],["代表跳过",{"2":{"41":1}}],["容易受到需求变更",{"2":{"104":1}}],["仅包含自动化用例用到的少部分公共方法",{"2":{"104":1}}],["仅驱动执行这一条用例",{"2":{"62":1}}],["涵盖了",{"2":{"104":1}}],["范围覆盖很少",{"2":{"104":1}}],["范围",{"2":{"104":1}}],["内外部开发者们的认可",{"2":{"111":1}}],["内容",{"2":{"104":1}}],["内置支持的条件跳过对象",{"2":{"40":1}}],["二者属于两个时代",{"2":{"104":1}}],["有些问题处理起来必然会影响到框架的兼容性",{"2":{"111":1}}],["有效性没有保障",{"2":{"104":1}}],["有效性",{"2":{"104":1}}],["有很大差异",{"2":{"104":1}}],["有何区别",{"0":{"104":1}}],["亦各从其志也",{"2":{"104":1}}],["道",{"2":{"104":1}}],["卫灵公",{"2":{"104":1}}],["论语",{"2":{"104":1}}],["孔子",{"2":{"104":1}}],["适合有离线部署需求的用户",{"2":{"112":1}}],["适配厂商可以直接使用这些单元测试进行适配测试",{"2":{"103":1}}],["适用于气泡类的断言",{"2":{"34":1}}],["专门针对元素操作方法函数进行测试",{"2":{"103":1}}],["对象的属性值",{"2":{"119":1}}],["对纯",{"2":{"111":1}}],["对套件的测试",{"0":{"103":1}}],["对于用例规模比较大的应用",{"2":{"37":1}}],["鼓励内外部开发者贡献",{"2":{"102":1}}],["发布",{"2":{"101":1}}],["发布一个套件版本",{"2":{"101":2}}],["阶段",{"2":{"101":1}}],["套件里面保存元素的操作方法",{"2":{"103":1}}],["套件由专人主责维护",{"2":{"102":1}}],["套件维护",{"0":{"102":1}}],["套件通过",{"2":{"101":1}}],["套件持续保持更新",{"2":{"101":1}}],["套件分大版本发布",{"2":{"101":1}}],["套件发布",{"0":{"101":1}}],["遵循",{"2":{"100":1}}],["供外部用例调用",{"2":{"100":1}}],["下划线连接单词",{"2":{"100":1,"109":1}}],["下完美的键鼠工具",{"2":{"95":1}}],["方便用例开发者以",{"2":{"133":1}}],["方便安装",{"2":{"112":1}}],["方案说明",{"0":{"100":1,"109":1}}],["方法唯一出口类",{"2":{"124":1}}],["方法基类",{"2":{"124":1}}],["方法层按需导入框架提供的底层能力",{"2":{"126":1}}],["方法层",{"0":{"126":1}}],["方法层目录",{"2":{"124":1}}],["方法层基础代码自动生成",{"2":{"114":1}}],["方法层所有的函数",{"2":{"12":1}}],["方法代码",{"2":{"114":1}}],["方法增删改的详细数据",{"2":{"95":1}}],["方法里面仍然可以单独打印日志",{"2":{"92":1}}],["方法中输出其他的日志",{"0":{"92":1}}],["方法只能有一个入参",{"2":{"41":1}}],["方法必须有返回结果并且为布尔值",{"2":{"41":1}}],["方法名必须以",{"2":{"41":1}}],["方法编写规范",{"2":{"41":1}}],["方法明细",{"0":{"34":1}}],["方法库里面",{"2":{"12":1}}],["方法",{"2":{"10":1}}],["└──",{"2":{"99":4,"108":5,"124":3}}],["工程结构",{"0":{"99":1,"108":1}}],["工程设计",{"0":{"98":1,"107":1},"1":{"99":1,"100":1,"108":1,"109":1}}],["工程自有断言模块",{"2":{"33":1}}],["组装成自动化测试用例",{"2":{"97":1}}],["测试方法套件中所有的方法均为原子操作",{"2":{"100":1}}],["测试方法套件是一个独立项目",{"2":{"97":1}}],["测试单驱动插件",{"2":{"95":1}}],["系统中各应用在",{"2":{"109":1}}],["系统中各应用划分自己的模块",{"2":{"100":1}}],["系统所有预装应用的测试用例",{"2":{"106":1}}],["系统所有预装应用的原子操作方法",{"2":{"104":1}}],["系统级测试用例",{"2":{"106":1}}],["系统自动化测试操作方法套件",{"2":{"97":1}}],["系统显示协议跳过",{"2":{"40":1}}],["全面插件化模块化",{"2":{"112":1}}],["全面优化框架接口调用机制",{"2":{"112":1}}],["全称",{"2":{"97":1}}],["全自动日志插件",{"2":{"95":1}}],["全自动日志",{"0":{"8":1},"1":{"9":1,"10":1,"11":1,"12":1}}],["将基于youqu2的用例代码修改为youqu3",{"2":{"95":1}}],["将跳过用例操作也整合进入用例标签",{"2":{"38":1}}],["迁移工具",{"2":{"95":1}}],["相对位移元素定位方案的配置文件",{"2":{"124":1}}],["相对位移定位插件",{"2":{"95":1}}],["相册的用例文件为",{"2":{"37":1}}],["操作系统环境支持不够友好",{"2":{"111":1}}],["操作系统预装应用的元素操作方法套件",{"2":{"97":1}}],["操作较为复杂",{"2":{"111":1}}],["操作或命令行操作",{"2":{"45":1}}],["操控插件",{"2":{"95":1}}],["键鼠操作插件",{"2":{"95":1}}],["✔️",{"2":{"95":14}}],["属性定位插件",{"2":{"95":1}}],["级别",{"2":{"94":1}}],["你可以配置为其他位置",{"2":{"94":1}}],["你可以使用它进行用例的驱动执行和管理",{"2":{"49":1}}],["必要配置项",{"0":{"94":1}}],["终端输出",{"2":{"91":1,"92":1,"93":1}}],["终端输出的日志级别",{"2":{"11":1}}],["直接调用基类里面的方法",{"2":{"91":1}}],["我是",{"2":{"91":6,"92":1}}],["我们可以将界面分为四个区域",{"2":{"126":1}}],["我们想要设计开发一个更加简单易用",{"2":{"111":1}}],["我们需要建立对套件的自动化测试",{"2":{"103":1}}],["我们设计出了",{"2":{"9":1}}],["我们发现",{"2":{"9":1}}],["其中所有的用例步骤都应该调用方法层对应的方法",{"2":{"127":1}}],["其中有一张图片识别成功即返回结果",{"2":{"34":1}}],["其他人可以提需求",{"2":{"102":1}}],["其他参数",{"0":{"87":1}}],["天天向上",{"2":{"85":2,"86":1}}],["天真",{"2":{"9":1}}],["客户端使用",{"0":{"82":1},"1":{"83":1,"84":1,"85":1,"86":1,"87":1}}],["客户端安装",{"0":{"81":1}}],["客户端",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1}}],["客户端提供了一个简单易用的函数",{"2":{"76":1}}],["写入以下内容",{"2":{"79":1}}],["名称你可以自定义",{"2":{"79":1}}],["随意新建一个py文件",{"2":{"79":1}}],["封装的",{"2":{"76":1,"97":1}}],["个机器瓜分",{"2":{"75":1}}],["个测试机",{"2":{"75":1}}],["个组",{"2":{"74":1}}],["都同时执行",{"2":{"75":1}}],["都不需要再写日志代码",{"2":{"12":1}}],["条",{"2":{"75":2}}],["条用例",{"2":{"75":2}}],["条件判断组合",{"2":{"41":1}}],["条件判断跳过",{"0":{"40":1}}],["假设总共",{"2":{"75":1}}],["同事们",{"2":{"111":1}}],["同样可以进行配置修改",{"2":{"94":1}}],["同一组内瓜分执行",{"2":{"75":1}}],["同时定义一些用例工程相关的配置",{"2":{"129":1}}],["同时框架可以在中间件中对插件功能进行增强或修改",{"2":{"120":1}}],["同时对各功能进行插件化",{"2":{"112":1}}],["同时选择多个环境",{"2":{"56":1}}],["同时标记了skip",{"2":{"42":1}}],["规则概述",{"2":{"75":1}}],["一键生成用例工程模板代码",{"2":{"114":1}}],["一些底层模块或接口命名不优雅",{"2":{"111":1}}],["一对大括号表示一个组",{"2":{"74":1}}],["一个元素一个方法",{"2":{"126":1}}],["一个页面一个类",{"2":{"126":1}}],["一个简单易用",{"2":{"88":1}}],["一个应用含有大量的操作函数",{"2":{"9":1}}],["一个函数里面至少包含一条日志信息",{"2":{"9":1}}],["分组规则",{"0":{"74":1}}],["分割",{"2":{"46":1}}],["服务的",{"2":{"95":1}}],["服务的图像识别插件",{"2":{"95":1}}],["服务的方式提供出来",{"2":{"45":1}}],["服务端启动服务",{"0":{"79":1}}],["服务端安装",{"0":{"78":1}}],["服务端",{"0":{"77":1},"1":{"78":1,"79":1}}],["服务",{"2":{"72":1,"76":1}}],["开发",{"2":{"104":1}}],["开启",{"2":{"72":1}}],["开头",{"2":{"41":1}}],["开头的",{"2":{"11":1}}],["如",{"2":{"69":1,"114":1,"129":1}}],["如果一个页面元素操作比较多",{"2":{"126":1}}],["如果一个应用存在多个页面",{"2":{"126":1}}],["如果涉及到复杂步骤的封装",{"2":{"109":1}}],["如果要修改识别语言",{"2":{"87":1}}],["如果存在多个",{"2":{"85":1}}],["如果你想修改端口",{"2":{"79":1}}],["如果你想执行这个",{"2":{"62":1}}],["如果应用受到新需求影响需要跳过",{"2":{"39":1}}],["如果不传默认截取全屏识别",{"2":{"34":1}}],["如果不传参",{"2":{"34":1}}],["如果用常规的图像识别则有可能无法识别到",{"2":{"34":1}}],["如果比较复杂操作步骤",{"2":{"9":1}}],["会自动加载并执行",{"2":{"69":1}}],["会自动生成一个命令",{"2":{"49":1,"50":1}}],["支持对用例执行的各个阶段插入钩子",{"2":{"137":1}}],["支持对各种测试策略的驱动执行",{"2":{"135":1}}],["支持对依赖环境进行一键打包",{"2":{"122":1}}],["支持用例目录或文件路径驱动执行",{"2":{"118":1}}],["支持基于关键词驱动用例执行",{"2":{"118":1}}],["支持基于测试单驱动插件驱动用例执行",{"2":{"118":1}}],["支持基于用例标签化管理驱动用例执行",{"2":{"118":1}}],["支持本地和远程执行模式",{"2":{"118":1}}],["支持多种用例驱动模式",{"2":{"114":1}}],["支持非开发者下运行",{"2":{"112":1}}],["支持离线部署",{"2":{"112":1}}],["支持在非开发着环境下运行用例",{"2":{"136":1}}],["支持在",{"2":{"68":1}}],["支持类名包含",{"2":{"11":1}}],["支持类名以",{"2":{"11":2}}],["加引号",{"2":{"67":1}}],["加上装饰器",{"2":{"12":1}}],["批量用例id驱动执行",{"0":{"66":1}}],["特有的",{"2":{"65":1}}],["特殊标签",{"2":{"37":1}}],["表达式",{"2":{"64":1,"65":1}}],["表示返回识别到的第一个",{"2":{"87":1}}],["表示用例的id",{"2":{"37":1}}],["表示识别任意一个目标字符",{"2":{"34":1}}],["表示识别所有目标字符",{"2":{"34":1}}],["关键词驱动等等",{"2":{"114":1}}],["关键词驱动支持",{"2":{"64":1}}],["关键词可以是用例对象中的任意字符",{"2":{"64":1}}],["整体数据流",{"0":{"116":1}}],["整体结构",{"0":{"2":1}}],["整个字符串中可以任意截取字符作为关键词",{"2":{"64":1}}],["且有完善的单元测试机制",{"2":{"104":1}}],["且存在较多涉及用例逻辑的复杂步骤方法",{"2":{"104":1}}],["且大小写不敏感",{"2":{"64":1}}],["且要方便能使用",{"2":{"44":1}}],["根据标签执行",{"0":{"65":1}}],["根据关键词执行",{"0":{"64":1}}],["根据不同的测试类型选择以上不同的安装命令",{"2":{"56":1}}],["根据不同的架构对等待时间进行倍数放大",{"2":{"21":1}}],["│\\t└──",{"2":{"63":1}}],["│\\t├──",{"2":{"63":1}}],["│",{"2":{"63":5,"99":5,"108":22,"124":12}}],["指定某张图片查找某个字符串的坐标",{"0":{"86":1}}],["指定某张图片识别的所有文字内容",{"0":{"84":1}}],["指定某个目录执行",{"0":{"63":1}}],["指定用例目录",{"2":{"67":1}}],["指定用例文件",{"2":{"67":1}}],["指定用例文件路径执行",{"0":{"67":1}}],["指定执行某一个用例",{"0":{"62":1}}],["本地执行子命令为",{"2":{"59":1}}],["本地执行",{"0":{"58":1},"1":{"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1}}],["本机命令行交互",{"0":{"24":1},"1":{"25":1,"26":1,"27":1}}],["创建一个目录",{"2":{"57":1}}],["创建用例工程",{"0":{"57":1}}],["基类",{"2":{"91":3}}],["基础环境默认支持",{"2":{"56":1}}],["基础环境guiwebuihttpremote",{"2":{"56":1}}],["基于此",{"2":{"9":1}}],["基于",{"2":{"9":1,"65":1,"76":1,"95":3}}],["快速开始",{"0":{"55":1},"1":{"56":1,"57":1}}],["无限可能",{"2":{"54":1}}],["🤙️",{"2":{"54":1}}],["接口自动化测试",{"2":{"54":2}}],["接口从而控制远程机器执行用例步骤",{"2":{"45":1}}],["🔥",{"2":{"95":1}}],["🚧",{"2":{"95":3}}],["🕷️",{"2":{"54":1}}],["🚀",{"2":{"54":1}}],["🚌",{"2":{"54":1}}],["💻",{"2":{"54":1}}],["🌏",{"2":{"54":1}}],["桌面应用",{"2":{"54":1}}],["☑",{"2":{"54":6}}],["能满足公司对自动化测试的业务需求",{"2":{"111":1}}],["能做什么",{"0":{"54":1}}],["能不能基于框架执行时",{"2":{"9":1}}],["$",{"2":{"52":1}}],["v25",{"2":{"101":1}}],["v20",{"2":{"101":2}}],["video",{"2":{"95":1}}],["virtualenv",{"2":{"52":1}}],["values",{"2":{"34":3}}],["删除虚拟环境",{"2":{"50":1}}],["激活虚拟环境",{"2":{"50":1}}],["命令安装使用",{"2":{"101":1}}],["命令可以将当前的虚拟环境删除",{"2":{"53":1}}],["命令",{"2":{"50":1}}],["命令行参数可以通过驱动命令提供入参选项",{"2":{"119":1}}],["命令行自动化",{"2":{"56":1}}],["命令行自动化测试",{"2":{"54":1}}],["命令行",{"2":{"46":1}}],["命令行传递参数",{"2":{"42":1}}],["命令行交互",{"0":{"23":1},"1":{"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1}}],["执行管理器接收命令行参数并读取公共配置项驱动用例执行",{"2":{"116":1}}],["执行模式支持本地驱动执行和远程驱动执行",{"2":{"114":1}}],["执行策略",{"0":{"75":1}}],["执行前确保远程机器已经开启了",{"2":{"72":1}}],["执行包含关键词的用例",{"2":{"64":1}}],["执行所有用例",{"0":{"61":1}}],["执行之后会自动创建一些有用的命令",{"2":{"50":1}}],["执行的时候会自动输出",{"2":{"12":1}}],["子命令",{"0":{"59":1,"72":1},"2":{"50":1}}],["还可以进行环境的管理",{"2":{"50":1}}],["虚拟环境默认在用例功能根目录下创建",{"2":{"122":1}}],["虚拟环境",{"0":{"50":1},"1":{"51":1,"52":1,"53":1}}],["种方式传入",{"2":{"46":1}}],["机器信息有",{"2":{"46":1}}],["它不能脱离",{"2":{"104":1}}],["它除了可以驱动用例执行",{"2":{"50":1}}],["它保存了远程测试机的信息列表",{"2":{"46":1}}],["它继承了",{"2":{"33":1}}],["交互的基础能力",{"2":{"45":1}}],["远程测试机分组策略",{"0":{"73":1},"1":{"74":1,"75":1}}],["远程机器执行的用例相同",{"2":{"72":1}}],["远程执行使用子命令",{"2":{"72":1}}],["远程执行就是用本地作为服务端控制远程机器执行",{"2":{"72":1}}],["远程执行",{"0":{"71":1},"1":{"72":1,"73":1,"74":1,"75":1}}],["远程交互式控制",{"0":{"45":1},"1":{"46":1,"47":1,"48":1}}],["远程命令行交互",{"0":{"28":1},"1":{"29":1,"30":1,"31":1}}],["打开进行编辑查看",{"2":{"44":1}}],["此配置文件需要维护大量的标签数据",{"2":{"44":1}}],["此时会抛异常",{"2":{"120":1}}],["此时",{"2":{"37":1}}],["已废弃",{"2":{"43":1}}],["已修复",{"2":{"42":2,"43":1}}],["废弃原因",{"2":{"43":1}}],["废弃用例是特殊的标签",{"2":{"37":1}}],["废弃用例",{"0":{"43":1},"2":{"36":1,"43":2}}],["该列存在",{"2":{"43":1}}],["环境依赖管理",{"0":{"122":1}}],["环境依赖管理等相关功能的目录文件也都一键生成",{"2":{"114":1}}],["环境依赖可以一键打包交付",{"2":{"112":1}}],["环境以提供",{"2":{"45":1}}],["环境影响或评估不再适用于自动化测试时",{"2":{"43":1}}],["环境信息",{"2":{"3":1}}],["针对某些用例",{"2":{"43":1}}],["针对于某些用例修复后",{"2":{"42":1}}],["yes",{"2":{"42":2}}],["youqu2",{"0":{"104":1},"2":{"95":1,"104":4,"111":3,"112":1}}],["youqu",{"0":{"69":1,"70":1},"2":{"46":1,"65":1,"68":2,"69":3,"95":9,"111":1}}],["youqu3",{"0":{"51":1,"52":1,"53":1,"54":1,"95":1,"110":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1},"2":{"9":2,"12":2,"13":1,"21":1,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"32":1,"33":3,"34":10,"45":1,"48":1,"49":2,"50":5,"51":1,"52":5,"53":1,"56":6,"57":1,"59":2,"61":2,"62":4,"63":2,"64":2,"65":2,"66":2,"67":6,"68":1,"69":1,"72":2,"75":2,"95":3,"97":1,"104":2,"106":1,"109":1,"111":1,"112":1,"114":1,"116":2,"118":1,"119":1,"123":1,"126":1,"128":2,"129":1}}],["you",{"2":{"16":1,"19":1}}],["中间件",{"2":{"120":1}}],["中用例增删改",{"2":{"95":1}}],["中文",{"2":{"87":1}}],["中同时填入后",{"2":{"42":1}}],["中的任意一个",{"2":{"34":1}}],["当传入要查找的字符串时",{"2":{"87":1}}],["当系统中安装了",{"2":{"49":1,"50":1}}],["当",{"2":{"42":1}}],["固定填入字段为",{"2":{"42":1}}],["固定跳过",{"0":{"39":1}}],["作为父类被",{"2":{"128":1}}],["作为标记该用例是否已经修复",{"2":{"42":1}}],["作为变量输出出来了",{"2":{"12":1}}],["新增一列标签名为",{"2":{"42":1}}],["但若用例层调用了此插件提供的功能",{"2":{"120":1}}],["但",{"2":{"111":1}}],["但仍然想要跳过用例",{"2":{"42":1}}],["但不能立即删除跳过原因",{"2":{"42":1}}],["但标签化管理的核心目的是集中化管理用例的标签",{"2":{"37":1}}],["推荐统一使用",{"2":{"41":1}}],["连接符号不可使用下划线和逗号",{"2":{"41":1}}],["连接服务器重试次数",{"2":{"34":1}}],["若插件没有被安装",{"2":{"120":1}}],["若插件已经安装",{"2":{"116":1}}],["若需要多个",{"2":{"41":1}}],["若函数需要多个参数",{"2":{"41":1}}],["若是",{"2":{"40":1}}],["重要",{"2":{"41":1}}],["重试间隔时间",{"2":{"34":1}}],["截取的左侧字符串作为函数名",{"2":{"41":1}}],["截取屏幕图片的间隔时间",{"2":{"34":1}}],["截取屏幕图片的时间",{"2":{"34":1}}],["korean",{"2":{"87":1}}],["k",{"2":{"62":4,"63":2,"64":2}}],["klvvw5821",{"2":{"40":1}}],["klvv",{"2":{"40":1}}],["keywords",{"0":{"70":1},"2":{"6":1,"68":1}}],["符号将两个方法分开",{"2":{"41":1}}],["符号",{"2":{"40":1,"41":1}}],["剔除中横线和",{"2":{"40":1}}],["型号",{"2":{"40":1}}],["查看机器的",{"2":{"40":1}}],["查找图片",{"2":{"12":2}}],["说明",{"2":{"40":1,"50":1}}],["则正常调用",{"2":{"116":1}}],["则返回一个字典",{"2":{"85":1}}],["则用例不会执行",{"2":{"43":1}}],["则用例不执行",{"2":{"41":1}}],["则新增一列标签名为",{"2":{"43":1}}],["则代码不会执行该条用例",{"2":{"42":1}}],["则执行该用例",{"2":{"41":1}}],["则跳过用例不执行",{"2":{"40":1}}],["则在此列备注具体的跳过原因",{"2":{"39":1}}],["或者",{"2":{"40":1}}],["判断当前架构是否为",{"2":{"40":1}}],["拼接",{"2":{"40":1}}],["多个用例文件",{"2":{"67":1}}],["多个机器信息用",{"2":{"46":1}}],["多个架构之间使用",{"2":{"40":1}}],["多个参数以逗号隔开",{"2":{"11":3}}],["架构设计",{"0":{"113":1,"115":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["架构设计规划",{"0":{"110":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1}}],["架构不跳过",{"2":{"40":1}}],["架构跳过",{"2":{"40":1}}],["架构名",{"2":{"40":1}}],["架构动态等待",{"0":{"21":1}}],["常见的场景为在不同架构上判断是否执行",{"2":{"40":1}}],["某些用例会因为不同的环境判断用例是否执行",{"2":{"40":1}}],["参数",{"2":{"40":2}}],["参数值可以传递任意命令行命令",{"2":{"16":1,"19":1}}],["最后所有的用例类均继承",{"2":{"128":1}}],["最终的用例状态会被标签为",{"2":{"39":1}}],["最大匹配次数",{"2":{"34":1}}],["最大匹配超时",{"2":{"34":1}}],["受到某新需求影响",{"2":{"39":1,"42":1,"43":1}}],["各模块编写思路",{"0":{"125":1},"1":{"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"135":1,"136":1,"137":1}}],["各功能以插件的方式接入",{"2":{"114":1}}],["各种代码风格不统一",{"2":{"104":1}}],["各种用例标签",{"2":{"39":1,"40":1,"42":1,"43":1}}],["各架构倍数",{"2":{"21":1}}],["示例",{"2":{"39":1,"40":1,"42":1}}],["而通过",{"2":{"38":1}}],["传统跳过用例的方式是在用例脚本里面给用例添加装饰器",{"2":{"38":1}}],["传统的日志输出方式",{"2":{"9":1}}],["跳过对象",{"2":{"40":1}}],["跳过的原因标签为",{"2":{"40":1}}],["跳过的原因统一标签开头为",{"2":{"39":1}}],["跳过用例可以直接通过修改",{"2":{"130":1}}],["跳过用例",{"0":{"38":1},"1":{"39":1,"40":1,"41":1}}],["跳过原因一栏中填写为",{"2":{"40":1}}],["跳过原因",{"2":{"36":1,"37":1,"38":1,"39":1,"40":1,"42":2,"43":1}}],["因此我们才萌生了对框架结构进行重新设计想法",{"2":{"111":1}}],["因此我们大胆的设想",{"2":{"9":1}}],["因此",{"2":{"103":1,"104":1}}],["因此你仍然可以在虚拟环境中使用命令",{"2":{"52":1}}],["因此若",{"2":{"37":1}}],["目标",{"0":{"112":1}}],["目标字符",{"2":{"34":1}}],["目录之间用空格分割",{"2":{"67":1}}],["目录组合",{"2":{"67":1}}],["目录下划分自己的用例模块",{"2":{"109":1}}],["目录下所有用例",{"2":{"63":1}}],["目录下",{"2":{"37":1}}],["所有的操作步骤都应该有一个对应的方法",{"2":{"126":1}}],["所有的方法按照",{"2":{"126":1}}],["所有的元素操作方法",{"2":{"100":1}}],["所有代码由专人维护",{"2":{"104":1}}],["所有方法以类的形式编写",{"2":{"100":1}}],["所有",{"2":{"37":1}}],["建议分模块",{"2":{"37":1}}],["比如",{"2":{"40":1,"41":1,"49":1,"64":1,"79":1,"101":2,"111":1,"126":2}}],["比如文件管理器",{"2":{"37":1}}],["比如气泡在1秒内消失",{"2":{"34":1}}],["后面会详细讲到",{"2":{"37":1}}],["后置命令行入参钩子",{"0":{"19":1}}],["后置脚本钩子",{"0":{"18":1}}],["后置钩子",{"0":{"17":1},"1":{"18":1,"19":1}}],["列之后的所有列都是一个用例标签",{"2":{"37":1}}],["列为",{"2":{"37":1}}],["第",{"2":{"37":1}}],["也可以对这个页面做进一步划分",{"2":{"126":1}}],["也可以方便对虚拟环境的管理和维护",{"2":{"122":1}}],["也可以是传统的",{"2":{"65":1}}],["也可以是自定义的数字代表用例序号",{"2":{"37":1}}],["也得到了公司领导",{"2":{"111":1}}],["也能自动打印",{"2":{"91":1}}],["也会正常执行",{"2":{"42":1}}],["也就是说我们需要写大量的日志代码",{"2":{"9":1}}],["举例",{"2":{"37":1}}],["取中间的名称作为",{"2":{"37":1}}],["去掉用例序号后的字符串",{"2":{"37":1}}],["quot",{"2":{"37":2,"56":2,"64":2,"66":2}}],["以便方法或用例中能够获取到",{"2":{"129":1}}],["以此控制虚拟环境创建",{"2":{"131":1}}],["以此来获取框架已有的公共配置",{"2":{"129":1}}],["以此类推",{"2":{"101":1}}],["以插件的形式提供功能",{"2":{"112":1}}],["以下简称测试用例",{"2":{"106":1}}],["以下简称测试方法套件",{"2":{"97":1}}],["以保持套件的各方面一致性",{"2":{"102":1}}],["以上写法表示有",{"2":{"74":1}}],["以",{"2":{"37":1,"112":1}}],["脚本文件id",{"2":{"36":1,"37":1,"39":1,"40":1}}],["脚本一样即可",{"2":{"16":1,"19":1}}],["使用更简单方便",{"2":{"112":1}}],["使用的框架不同",{"2":{"104":1}}],["使用逻辑表达式的时候一定要加引号",{"2":{"64":1,"66":1}}],["使用脚手架功能创建用例工程",{"2":{"57":1}}],["使用",{"2":{"40":1,"41":1,"101":1,"114":1}}],["使用说明",{"0":{"36":1}}],["使用方法很简单",{"2":{"12":1}}],["使用方法",{"0":{"12":1,"90":1},"1":{"91":1,"92":1,"93":1}}],["+",{"2":{"34":2,"40":1,"119":1}}],["`japan`",{"2":{"34":1}}],["`korean`",{"2":{"34":1}}],["`german`",{"2":{"34":1}}],["`fr`",{"2":{"34":1}}],["`en`",{"2":{"34":1}}],["`ch`",{"2":{"34":1}}],["返回原始数据",{"2":{"87":1}}],["返回当前屏幕中",{"2":{"85":1}}],["返回识别图片",{"2":{"84":1}}],["返回识别到的所有数据",{"2":{"34":1}}],["返回",{"2":{"41":2}}],["返回图片中识别到的所有字符串",{"2":{"34":1}}],["只需要在这里挂一个装饰器",{"2":{"91":1,"92":1,"93":1}}],["只需要在出口文件加上类装饰器",{"2":{"12":1}}],["只需要加一个装饰器",{"2":{"88":1}}],["只返回第一个",{"2":{"34":1,"87":1}}],["要识别的图片路径",{"2":{"34":1}}],["要识别的模板图片",{"2":{"34":1}}],["并提示用户安装对应插件",{"2":{"120":1}}],["并根据需要将测试结果",{"2":{"116":1}}],["并动态加载",{"2":{"116":1}}],["并在系统关键节点发布对应的版本",{"2":{"101":1}}],["并将截取的右侧作为参数传递给该函数",{"2":{"41":1}}],["并返回其在图片中的坐标",{"2":{"34":1}}],["并且所有调用的方法会以",{"2":{"12":1}}],["识别插件",{"2":{"95":1}}],["识别语言",{"2":{"87":1}}],["识别当前屏幕的所有文字内容",{"0":{"83":1}}],["识别一个字符串或多个字符串",{"2":{"34":1}}],["识别率",{"2":{"34":1}}],["结果",{"2":{"34":2}}],["结尾的",{"2":{"11":1}}],["预期值",{"2":{"34":4}}],["不需要修改用例脚本",{"2":{"130":1}}],["不需要用户去了解和思考哪些插件适合哪种测试类型",{"2":{"121":1}}],["不再提供",{"2":{"119":1}}],["不安装插件的情况下框架也能正常运行",{"2":{"112":1}}],["不适合对外开源发布",{"2":{"104":1}}],["不涉及用例逻辑",{"2":{"104":1}}],["不受需求变更影响",{"2":{"104":1}}],["不兼容",{"2":{"104":1}}],["不相为谋",{"2":{"104":1}}],["不同",{"2":{"104":1}}],["不同组之间相同执行",{"2":{"75":1}}],["不做复杂步骤的封装",{"2":{"100":1}}],["不存在复杂步骤的堆叠封装",{"2":{"104":1}}],["不存在",{"2":{"34":2}}],["不显示",{"2":{"5":1}}],["存在跳过标签则用例也不会被执行",{"2":{"39":1}}],["存在",{"2":{"34":2}}],["应用名字",{"2":{"34":2}}],["元素不应存在",{"2":{"34":1}}],["元素不存在",{"2":{"34":1}}],["元素识别动态等待",{"0":{"22":1}}],["匹配度",{"2":{"34":1,"87":1}}],["匹配元素的格式",{"2":{"34":2}}],["匹配相似度",{"2":{"34":2}}],["是在",{"2":{"104":1}}],["是不同的测试方法套件版本",{"2":{"101":1}}],["是基于",{"2":{"97":1,"104":1,"106":1}}],["是",{"2":{"46":1,"111":1}}],["是否分模块维护取决于应用的用例复杂度",{"2":{"37":1}}],["是否递归查找",{"2":{"34":1}}],["是类装饰器",{"2":{"12":1}}],["路径驱动",{"2":{"114":1}}],["路径",{"2":{"34":2}}],["断言",{"0":{"128":1}}],["断言方法类",{"2":{"124":1}}],["断言资源",{"2":{"124":1}}],["断言文案不存在",{"2":{"34":1}}],["断言文案存在",{"2":{"34":1}}],["断言文件不存在",{"2":{"34":1}}],["断言文件存在",{"2":{"34":1}}],["断言结果为假",{"2":{"34":1}}],["断言结果为真",{"2":{"34":1}}],["断言不相等",{"2":{"34":1}}],["断言相等",{"2":{"34":1}}],["断言应用进程不存在",{"2":{"34":1}}],["断言应用进程状态",{"2":{"34":4}}],["断言应用进程存在",{"2":{"34":1}}],["断言元素不存在",{"2":{"34":1}}],["断言元素存在",{"2":{"34":1}}],["断言语句",{"0":{"32":1},"1":{"33":1,"34":1}}],["~",{"2":{"34":2,"84":1,"86":1}}],["文件来控制用例是否跳过",{"2":{"130":1}}],["文件来管理跳过用例则会方便很多",{"2":{"38":1}}],["文件里面写标签的表达式",{"2":{"69":1}}],["文件里面跳过原因列是否存在跳过标签",{"2":{"39":1}}],["文件管理的标签",{"2":{"65":1}}],["文件管理器",{"2":{"48":1,"126":2}}],["文件几乎是唯一能满足所有的要求的文件格式",{"2":{"44":1}}],["文件格式",{"0":{"44":1}}],["文件中定义用例对象的标签",{"2":{"130":1}}],["文件中自定义用例集驱动执行",{"2":{"68":1}}],["文件中所有的用例",{"2":{"62":1}}],["文件中查找是否有同名函数",{"2":{"41":1}}],["文件中",{"2":{"40":1}}],["文件中新增一列为",{"2":{"38":1}}],["文件中写入标签",{"2":{"36":1}}],["文件太多了也是一个很糟糕的事情",{"2":{"37":1}}],["文件建议放在一个",{"2":{"37":1}}],["文件",{"2":{"37":1,"69":1}}],["文件的文件名",{"2":{"37":1}}],["文件去掉首字符串",{"2":{"37":1}}],["文件存在",{"2":{"34":1}}],["文件名称",{"2":{"64":1}}],["文件名就应为",{"2":{"37":1}}],["文件名",{"2":{"34":1}}],["文件全路径",{"2":{"34":1}}],["文件全路径或目录",{"2":{"34":1}}],["文件不存在",{"2":{"34":1}}],["文管方法库出口",{"2":{"12":1}}],["期望结果",{"2":{"34":2}}],["期望元素不存在",{"2":{"34":1}}],["期望元素存在",{"2":{"34":1}}],["期望不存在文件路径",{"2":{"34":1}}],["期望存在文件路径",{"2":{"34":1}}],["期望界面不存在模板图片",{"2":{"34":1}}],["期望界面存在模板图片",{"2":{"34":1}}],["屏幕上匹配不存在图片",{"2":{"34":1}}],["屏幕上匹配图片",{"2":{"34":2}}],["默认环境变量管理文件",{"0":{"131":1},"2":{"124":1}}],["默认日志输出级别为",{"2":{"94":1}}],["默认是在",{"2":{"94":1}}],["默认情况下是会将识别到的多个目标组装成字典返回",{"2":{"87":1}}],["默认端口号为",{"2":{"79":1}}],["默认值为",{"2":{"34":1}}],["默认为false",{"2":{"87":1}}],["默认为0",{"2":{"87":1}}],["默认为ch",{"2":{"87":1}}],["默认为",{"2":{"34":1}}],["默认不间隔",{"2":{"34":1}}],["默认关闭",{"2":{"5":1}}],["单位秒",{"2":{"34":3}}],[">不为假",{"2":{"34":1}}],[">不为真",{"2":{"34":1}}],[">不相等",{"2":{"34":2}}],[">是否相等",{"2":{"34":2}}],[">与实际值",{"2":{"34":4}}],[">",{"2":{"34":9}}],[">=",{"2":{"34":3}}],["例",{"2":{"34":3}}],["例如",{"2":{"9":1,"34":1,"40":1}}],["on",{"2":{"126":1,"127":1}}],["only",{"2":{"34":1}}],["or",{"2":{"34":1,"64":1,"65":3,"66":9,"69":2}}],["ocr",{"2":{"34":4,"76":1,"79":2,"83":3,"84":1,"85":1,"86":1,"87":4,"95":1}}],["os",{"2":{"34":5}}],["outcome",{"2":{"6":1}}],["8888",{"2":{"79":1,"83":1}}],["8890",{"2":{"79":1}}],["8",{"0":{"133":1},"2":{"34":1,"48":1,"91":1,"92":1,"93":1,"95":1,"111":1}}],["继承了",{"2":{"128":1}}],["继承了基类baselog",{"2":{"91":1,"92":1,"93":1}}],["继承",{"2":{"33":1,"128":1}}],["用户只需要创建符合框架定义的文件命名规范脚本文件",{"2":{"137":1}}],["用户只需要关注用例",{"2":{"114":1}}],["用户可直接通过",{"2":{"101":1}}],["用于用例开发调试过程中",{"2":{"133":1}}],["用于统一存放用例步骤的操作方法",{"2":{"126":1}}],["用于统一管理命令行参数驱动用例执行",{"2":{"118":1}}],["用于虚拟环境安装",{"2":{"50":1}}],["用于属性定位相关操作",{"2":{"48":1}}],["用于保存用例标签",{"2":{"37":1}}],["用例标签管理文件",{"0":{"130":1},"2":{"124":1}}],["用例标签化管理插件",{"2":{"95":1}}],["用例示例",{"2":{"124":2}}],["用例工程配置对象继承",{"2":{"129":1}}],["用例工程配置模块建议继承",{"2":{"119":1}}],["用例工程的断言方法类",{"2":{"128":1}}],["用例工程名称",{"2":{"124":1}}],["用例工程结构",{"0":{"124":1}}],["用例工程支持一键创建",{"2":{"123":1}}],["用例工程设计",{"0":{"123":1},"1":{"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1}}],["用例层负责管理用例逻辑",{"2":{"127":1}}],["用例层目录",{"2":{"124":1}}],["用例层",{"0":{"127":1},"2":{"114":1}}],["用例层直接",{"2":{"114":1}}],["用例整体打包交付之后",{"2":{"112":1}}],["用例开发环境下更新版本不方便",{"2":{"111":1}}],["用例失败录屏插件",{"2":{"95":1}}],["用例文件",{"2":{"67":1}}],["用例驱动方式",{"0":{"60":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1}}],["用例执行所需要的资源",{"2":{"124":1}}],["用例执行完成后生成多种测试报告",{"2":{"116":1}}],["用例执行过程中动态调用",{"2":{"116":1}}],["用例执行驱动的命令",{"2":{"50":1}}],["用例执行时判断",{"2":{"39":1}}],["用例需要废弃",{"2":{"43":1}}],["用例id",{"2":{"42":1,"43":1}}],["用例脚本的",{"2":{"37":1}}],["用例中所需要的方法从",{"2":{"109":1}}],["用例中通过",{"2":{"33":1}}],["用例中使用方法",{"0":{"33":1}}],["用例基类",{"2":{"33":2,"124":1}}],["用两对大括号把函数的参数括起来",{"2":{"12":1}}],["几乎满足了所有的断言场景",{"2":{"32":1}}],["自定义执行",{"0":{"68":1},"1":{"69":1,"70":1}}],["自定义条件判断跳过的函数写在此文件中",{"2":{"41":1}}],["自定义跳过",{"0":{"41":1}}],["自定义断言类",{"2":{"34":1}}],["自带多种断言语句",{"2":{"32":1}}],["自动安装框架及改测试类型需要的插件依赖",{"2":{"121":1}}],["自动统计分析每次",{"2":{"95":1}}],["自动化插件",{"2":{"95":1}}],["自动化测试框架",{"2":{"112":1}}],["自动化测试框架操作方法封装写法",{"2":{"9":1}}],["自动化测试用例",{"0":{"105":1},"1":{"106":1,"107":1,"108":1,"109":1},"2":{"106":1}}],["自动化测试方法套件",{"0":{"96":1},"1":{"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1},"2":{"97":1}}],["自动化测试模块",{"2":{"95":1}}],["自动化测试",{"2":{"54":2}}],["自动输出日志的类名称",{"2":{"94":1}}],["自动输出日志",{"0":{"91":1}}],["自动输出的日志",{"2":{"12":1}}],["自动识别当前整个屏幕的所有内容",{"2":{"83":1}}],["自动将函数说明打印为日志",{"2":{"11":3}}],["自动的将函数说明作为日志打印出来",{"2":{"9":1}}],["umtk",{"0":{"96":1,"104":1},"1":{"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1},"2":{"97":1,"99":1,"100":1,"101":2,"104":4,"106":1,"109":2}}],["ui操作远程对象",{"0":{"47":1},"1":{"48":1}}],["ui",{"2":{"45":2,"54":2,"95":1,"108":1,"124":1}}],["union",{"2":{"34":3}}],["uniontech",{"2":{"34":1,"91":1,"92":1,"93":1}}],["utf",{"2":{"34":1,"91":1,"92":1,"93":1}}],["usable",{"2":{"95":1}}],["usr",{"2":{"34":1,"91":1,"92":1,"93":1}}],["user4",{"2":{"74":2,"75":2}}],["user3",{"2":{"74":2,"75":2}}],["user2",{"2":{"74":2,"75":2}}],["user1",{"2":{"74":2,"75":2}}],["user=",{"2":{"48":1}}],["user=user",{"2":{"48":1}}],["user",{"2":{"29":1,"30":1,"31":1,"48":1,"94":1}}],["username",{"2":{"27":1}}],["uos",{"0":{"96":1,"105":1},"1":{"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"106":1,"107":1,"108":1,"109":1},"2":{"12":1,"48":1,"97":4,"104":1,"106":3}}],["普通权限执行",{"0":{"25":1,"29":1}}],["增加了等待的日志",{"2":{"21":1}}],["优化",{"2":{"21":1}}],["可实现群控测试机执行",{"2":{"112":1}}],["可视化配置",{"0":{"135":1},"2":{"112":1}}],["可视化驱动",{"2":{"95":1}}],["可定制化依赖",{"2":{"112":1}}],["可能存在当前屏幕中有多个目标",{"2":{"87":1}}],["可能包含多条日志信息",{"2":{"9":1}}],["可自定义多个参数之间的连接符",{"2":{"41":1}}],["可以通过系统环境变量或修改",{"2":{"119":1}}],["可以根据测试项目类型安装对应的依赖",{"2":{"112":1}}],["可以在通过命令行快速驱动测试用例执行",{"2":{"114":1}}],["可以在无网络环境下直接运行",{"2":{"112":1}}],["可以在方法层",{"2":{"109":1}}],["可以对外开源发布",{"2":{"104":1}}],["可以调用",{"2":{"100":1}}],["可以修改为从0到1的数",{"2":{"87":1}}],["可以自动安装对应的依赖集",{"2":{"56":1}}],["可以自动加载虚拟环境并驱动用例工程",{"2":{"51":1}}],["可以激活虚拟环境",{"2":{"52":1}}],["可以随意新增",{"2":{"37":1}}],["可以完全代替之前这样的写法",{"2":{"21":1}}],["german",{"2":{"87":1}}],["get",{"2":{"34":3}}],["getmembers",{"2":{"10":1}}],["group2",{"2":{"74":1,"75":1}}],["group1",{"2":{"74":1,"75":2}}],["group",{"2":{"74":1}}],["gui",{"2":{"34":7,"48":3,"56":2,"95":1,"109":1}}],["gpl",{"2":{"34":1}}],["github",{"2":{"76":1,"88":1}}],["git",{"2":{"16":1,"19":1,"95":1,"114":1}}],["home",{"2":{"94":1}}],["html",{"2":{"95":2}}],["https",{"2":{"76":1,"88":1}}],["http",{"2":{"54":1,"56":1}}],["htop",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1}}],["h",{"2":{"49":1}}],["has",{"2":{"7":1}}],["就能自动日志输出类里面所有的方法的功能说明",{"2":{"88":1}}],["就像写",{"2":{"16":1,"19":1}}],["就可以实现自动输出日志了",{"2":{"12":1}}],["入参",{"2":{"16":1,"19":1}}],["├──",{"2":{"15":3,"18":3,"63":4,"99":9,"108":19,"124":17}}],["框架预设一些文件接口规范",{"2":{"137":1}}],["框架的安装命令可以根据用例工程所属的测试类型",{"2":{"121":1}}],["框架的断言库",{"2":{"33":1}}],["框架可以正常运行",{"2":{"120":1}}],["框架底层对各功能插件提供",{"2":{"120":1}}],["框架总线接口",{"0":{"120":1}}],["框架提供驱动命令",{"2":{"118":1}}],["框架提供驱动执行的命令",{"2":{"114":1}}],["框架驱动命令传递命令行参数给执行管理器",{"2":{"116":1}}],["框架也提供初始化用例工程的功能",{"2":{"114":1}}],["框架源代码不直接呈现在用户面前",{"2":{"114":1}}],["框架代码及插件库以",{"2":{"114":1}}],["框架层提供总线服务",{"2":{"114":1}}],["框架和插件库独立维护更新",{"2":{"112":1}}],["框架而独立使用",{"2":{"104":1}}],["框架会在用例执行之前执行",{"2":{"16":1,"19":1}}],["框架会在用例执行之前自动加载并执行",{"2":{"15":1,"18":1}}],["框架支持通过",{"2":{"16":1,"19":1}}],["框架默认生成",{"2":{"0":1}}],["前置命令行入参钩子",{"0":{"16":1}}],["前置脚本钩子",{"0":{"15":1}}],["前置钩子",{"0":{"14":1},"1":{"15":1,"16":1}}],["前后钩子",{"0":{"13":1},"1":{"14":1,"15":1,"16":1,"17":1,"18":1,"19":1}}],["这些元素操作方法可以用于自动化用例调用",{"2":{"97":1}}],["这是在类外面打",{"2":{"93":3}}],["这是我想再输出的其他",{"2":{"92":3}}],["这个命令可以在系统原生环境中使用",{"2":{"50":1}}],["这样在用例中能够使用统一的断言语句",{"2":{"128":1}}],["这样在日志输出的时候就能把调用函数时参数的值输出出来",{"2":{"12":1}}],["这样这条用例即使同时标记了",{"2":{"42":1}}],["这种方式需要修改用例代码",{"2":{"38":1}}],["这就是我们参考django",{"2":{"12":1}}],["japan",{"2":{"87":1}}],["job",{"2":{"15":2,"16":3,"18":2,"19":3}}],["jinja2",{"2":{"12":1}}],["json",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"2":{"0":3,"2":1,"3":1,"4":1,"6":1,"7":1}}],["和上面逻辑相反",{"2":{"40":1}}],["和",{"0":{"104":1},"2":{"12":1,"42":2,"75":1,"104":2,"106":1,"111":1}}],["没错",{"2":{"12":1}}],["函数名等等都可以做为关键词",{"2":{"64":1}}],["函数名",{"2":{"40":1}}],["函数功能说明中",{"2":{"12":1}}],["函数说明以及函数操作日志",{"2":{"9":1}}],["细心的同学可能还发现了一个小细节",{"2":{"12":1}}],["展示在",{"2":{"12":1}}],["静态方法",{"2":{"12":1}}],["包的形式提供框架能力",{"2":{"112":1}}],["包含客户端和服务端",{"2":{"76":1}}],["包含",{"2":{"75":1}}],["包含静态方法",{"2":{"10":1}}],["包括实例方法",{"2":{"12":1}}],["之后",{"2":{"12":1,"49":1,"50":1}}],["|",{"2":{"12":2}}],["md",{"2":{"99":1,"108":1}}],["movie",{"2":{"99":1}}],["mousekey",{"2":{"95":1}}],["mode",{"2":{"34":6}}],["music",{"2":{"64":5,"67":6,"99":3}}],["multiple=multiple",{"2":{"12":1,"34":2}}],["multiple=false",{"2":{"12":1}}],["multiple",{"2":{"12":1,"34":2}}],["my",{"2":{"33":1,"52":1,"57":2,"63":1,"124":2,"126":1,"127":1}}],["mycasemethod",{"2":{"126":1,"127":2}}],["mycase",{"2":{"33":1,"63":2,"124":3,"127":2,"128":2}}],["maintainer",{"2":{"102":1}}],["main",{"2":{"48":1,"91":1,"92":1,"93":1}}],["manage",{"2":{"42":1,"95":1,"126":1,"127":1}}],["manager",{"2":{"34":1,"48":2,"99":2,"100":2,"101":1,"108":2,"109":1,"127":1}}],["mark",{"2":{"38":1,"65":1,"95":1}}],["max",{"2":{"34":7}}],["match",{"2":{"34":11}}],["machine",{"2":{"27":1}}],["map",{"2":{"12":1}}],["mips64",{"2":{"21":1}}],["method",{"2":{"11":1,"12":3,"15":1,"18":1,"33":4,"91":12,"92":2,"97":1,"99":4,"108":5,"109":1,"124":4,"126":3,"127":2,"128":4}}],["metadata",{"2":{"3":1,"6":1}}],["message",{"2":{"7":1}}],["注意给元组类型",{"2":{"94":1}}],["注意这里",{"2":{"91":1,"92":1,"93":1}}],["注意ip和端口要和你的服务端ip对应",{"2":{"83":1}}],["注意",{"2":{"12":1,"56":1,"64":1,"66":1,"67":1}}],["num",{"2":{"95":1}}],["number=max",{"2":{"34":2}}],["number=match",{"2":{"34":2}}],["number",{"2":{"34":9}}],["network",{"2":{"34":9}}],["not",{"2":{"34":13,"40":2,"64":1,"65":1}}],["none",{"2":{"34":26}}],["nodeid",{"2":{"6":1,"7":1}}],["n",{"2":{"27":1}}],["name",{"2":{"11":3,"40":3,"48":1,"91":2,"92":2,"93":2,"94":4,"95":1}}],["==",{"2":{"34":5,"48":1,"91":1,"92":1,"93":1}}],["=",{"2":{"11":4,"12":1,"21":5,"34":36,"48":2,"79":1,"83":2,"91":1,"92":1,"93":1,"94":3}}],["动态等待",{"0":{"20":1},"1":{"21":1,"22":1}}],["动态添加日志装饰器",{"2":{"10":1}}],["动态给该类下所有的函数及父类函数添加日志装饰器",{"2":{"10":1}}],["给符合条件的函数",{"2":{"10":1}}],["实际结果",{"2":{"34":2}}],["实例",{"2":{"12":1}}],["实例方法",{"2":{"10":1}}],["实现插件依赖的定制化",{"2":{"114":1}}],["实现步骤",{"2":{"10":1}}],["实现原理",{"0":{"10":1}}],["类似于单元测试",{"2":{"103":1}}],["类名包含什么字符",{"2":{"94":1}}],["类名以什么结尾",{"2":{"94":1}}],["类名以什么开头",{"2":{"94":1}}],["类名",{"2":{"64":1}}],["类",{"2":{"10":1,"91":3,"92":1}}],["类方法",{"2":{"10":1,"12":1}}],["类里面一个函数只包含一个操作或多次调用的一系列可合并的操作",{"2":{"9":1}}],["在浏览器中输入一些配置后即可驱动测试用例执行",{"2":{"112":1}}],["在继承",{"2":{"112":1}}],["在现有框架下",{"2":{"111":1}}],["在公司的多个自动化流程中运行得很好",{"2":{"111":1}}],["在公司内部已经被大量的自动化测试项目使用",{"2":{"111":1}}],["在操作方法多了之后",{"2":{"103":1}}],["在同一个大版本中",{"2":{"101":1}}],["在不同的代码仓库中",{"2":{"101":1}}],["在外层其他直接使用",{"0":{"93":1}}],["在全屏指定查找某个字符串的坐标",{"0":{"85":1}}],["在根目录下定义",{"2":{"69":1}}],["在服务端通过调用",{"2":{"45":1}}],["在远程测试机上部署一个完整的",{"2":{"45":1}}],["在用例执行过程中控制远程机器执行复杂的",{"2":{"45":1}}],["在用例收集阶段会以第一个",{"2":{"41":1}}],["在用例工程根目录下存放",{"2":{"41":1}}],["在用例工程目录下存放一个",{"2":{"15":1,"18":1}}],["在用例工程目录下生成报告文件",{"2":{"0":1}}],["在子项目目录下新建",{"2":{"37":1}}],["在",{"2":{"36":1,"38":1,"40":1,"41":1,"130":1}}],["在一段时间内截图多张图片进行识别",{"2":{"34":1}}],["在报告中更能一目了然的看到用例执行步骤",{"2":{"12":1}}],["在屏幕中相似度大于",{"2":{"12":2}}],["在应用库",{"2":{"12":1}}],["在此装饰器中我们能动态的捕获所调用函数的功能说明",{"2":{"10":1}}],["核心原理",{"2":{"10":1}}],["的路径",{"2":{"129":1}}],["的思路",{"2":{"126":1}}],["的框架下进行开发的",{"2":{"104":1}}],["的公共方法库",{"0":{"104":1},"2":{"104":1}}],["的内容",{"2":{"84":1}}],["的用例",{"2":{"42":1}}],["的脚本",{"2":{"15":1,"18":1}}],["的模板语法设计出的日志模板语法",{"2":{"12":1}}],["的坐标",{"2":{"12":2,"85":1}}],["的",{"2":{"11":1,"95":1,"128":1}}],["的方式",{"2":{"10":1,"12":1}}],["的日志系统",{"2":{"9":1}}],["的想法",{"2":{"9":1}}],["那真是妙啊~",{"2":{"9":1}}],["从任务栏启动文件管理器",{"2":{"127":1}}],["从而驱动测试用例执行",{"2":{"118":1}}],["从而减少大量日志代码量和重复编写",{"2":{"9":1}}],["从开源至今发布了",{"2":{"111":1}}],["从第",{"2":{"37":1}}],["从上面的例子也可以看出来",{"2":{"9":1}}],["具有较高的重复度",{"2":{"9":1}}],["通过配置的接口进行数据回填",{"2":{"116":1}}],["通过命令行参数控制",{"2":{"114":1}}],["通过不同的参数控制返回不同的值",{"2":{"76":1}}],["通过获取该函数返回的布尔值",{"2":{"41":1}}],["通过ocr识别到不应存在的文案",{"2":{"34":2}}],["通过ocr未识别到",{"2":{"34":3}}],["通过观察前面的例子",{"2":{"12":1}}],["通过",{"2":{"10":2}}],["通过日志输出器将其输出即可",{"2":{"10":1}}],["通过给类加上一个装饰器",{"2":{"10":1}}],["通过经验观察",{"2":{"9":1}}],["通常是这样的",{"2":{"9":1}}],["省略代码部分",{"2":{"9":1}}],["l1",{"2":{"65":3}}],["lang",{"2":{"34":1,"87":1}}],["lang=lang",{"2":{"34":2}}],["lang=",{"2":{"34":2,"87":1}}],["lambda",{"2":{"12":1,"34":2}}],["leftmethod",{"2":{"126":1}}],["len",{"2":{"34":4}}],["level日志级别",{"2":{"94":1}}],["level",{"2":{"11":1,"94":1}}],["list",{"2":{"34":1}}],["license",{"2":{"34":1,"91":2,"92":2,"93":2,"99":1,"108":1}}],["lineno",{"2":{"6":1}}],["linuxdeepin",{"2":{"76":1,"88":1,"111":1}}],["linux",{"2":{"3":1,"54":3,"56":1,"95":1,"112":1}}],["ltd",{"2":{"34":1,"91":1,"92":1,"93":1}}],["l",{"2":{"27":1,"29":1}}],["ls",{"2":{"25":1,"27":1,"29":1}}],["loogarch64",{"2":{"40":2}}],["loongarch64",{"2":{"21":1}}],["lower",{"2":{"34":1}}],["logs",{"2":{"94":1}}],["log装饰器自动打印",{"2":{"91":1,"92":1}}],["log",{"2":{"10":1,"11":1,"12":5,"34":2,"91":3,"92":3,"93":6,"94":4}}],["logger直接调用",{"2":{"93":1}}],["logger",{"2":{"9":1,"12":1,"34":12,"91":2,"92":5,"93":5}}],["点击某个元素",{"2":{"9":2,"12":1}}],["dragon",{"2":{"95":1}}],["driver",{"2":{"95":1,"118":2}}],["d",{"2":{"95":1}}],["dbus",{"2":{"54":1}}],["dmidecode",{"2":{"40":1}}],["dict",{"2":{"34":4}}],["ddefilemanagermethod",{"2":{"100":2,"101":1,"109":1}}],["dde",{"2":{"34":1,"48":3,"99":2,"100":2,"101":1,"108":4,"109":1,"126":1,"127":2}}],["during",{"2":{"34":2}}],["duration",{"2":{"2":1}}],["dogtail",{"2":{"48":1,"95":1,"126":3}}],["do",{"2":{"16":2,"19":2}}],["dock",{"2":{"48":1,"108":4,"126":1,"127":1}}],["doc",{"2":{"10":1}}],["dfm",{"2":{"12":2,"108":2}}],["deepin",{"2":{"99":4}}],["desc",{"2":{"95":1}}],["desktop",{"2":{"34":2,"84":1,"86":1}}],["debug",{"2":{"11":1,"91":1,"92":3,"93":3,"94":1,"124":1,"133":1}}],["default=false",{"2":{"87":1}}],["default",{"2":{"87":1}}],["def",{"2":{"9":1,"12":2,"33":1,"34":15,"48":2,"62":2,"91":6,"92":1,"127":1,"128":1}}],["需要在每个函数里面主动编写日志输出代码",{"2":{"9":1}}],["背景",{"0":{"9":1,"111":1}}],["id4",{"2":{"66":3}}],["id3",{"2":{"66":3,"69":1}}],["id2",{"2":{"66":3,"69":1}}],["id1",{"2":{"66":3,"69":1}}],["identifier",{"2":{"34":1,"91":1,"92":1,"93":1}}],["issue",{"2":{"102":1}}],["isinstance",{"2":{"34":4}}],["is",{"2":{"34":6}}],["ifixed",{"2":{"42":2}}],["if",{"2":{"34":23,"48":1,"91":1,"92":1,"93":1}}],["ip4",{"2":{"74":2,"75":2}}],["ip3",{"2":{"74":2,"75":2}}],["ip2",{"2":{"74":2,"75":2}}],["ip1",{"2":{"74":2,"75":2}}],["ip=",{"2":{"48":1}}],["ip=ip",{"2":{"48":1}}],["ip",{"2":{"27":1,"29":1,"30":1,"31":1,"48":1,"83":1}}],["imagecenter",{"2":{"95":1}}],["image",{"2":{"12":4,"34":6,"124":1,"129":1}}],["import",{"2":{"11":1,"12":2,"21":2,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"33":3,"34":12,"48":2,"79":3,"83":2,"91":3,"92":3,"93":3,"94":3,"100":1,"101":1,"109":2,"114":1,"126":2,"127":2,"128":3}}],["in",{"2":{"34":2}}],["int",{"2":{"34":18}}],["ini",{"2":{"108":2,"119":1,"124":1}}],["inix86",{"2":{"21":1}}],["init",{"2":{"7":1,"48":1,"57":1,"63":1,"99":3,"108":4,"123":1,"124":2}}],["install",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1,"56":6,"78":1,"81":1,"89":1,"101":1}}],["inspect",{"2":{"10":1}}],["info",{"2":{"9":1,"11":2,"12":1,"34":11,"92":2,"93":2,"94":1}}],["items",{"2":{"34":2}}],["it",{"2":{"7":1}}],["autotest",{"2":{"57":2,"97":1}}],["auto",{"2":{"48":3}}],["amp",{"2":{"40":3,"41":5}}],["album",{"2":{"37":2}}],["all",{"2":{"34":5}}],["allure",{"2":{"12":2}}],["and",{"2":{"34":3,"64":4,"65":1}}],["any",{"2":{"34":3}}],["arrch64",{"2":{"40":1}}],["args",{"2":{"34":7}}],["arch",{"2":{"3":2}}],["actual",{"2":{"34":10}}],["as",{"2":{"34":6}}],["assertoptionerror",{"2":{"34":3}}],["assertionerror",{"2":{"34":18}}],["assertmethod",{"2":{"33":5,"128":5}}],["assertx",{"2":{"33":1}}],["assert",{"2":{"33":6,"34":18,"108":1,"124":2,"127":1,"128":9,"129":1}}],["abspath=",{"2":{"84":1,"86":1}}],["abspath=config",{"2":{"48":1}}],["abspath=pic",{"2":{"34":2}}],["abspath=picture",{"2":{"34":2}}],["abspath=none",{"2":{"34":2}}],["abspath",{"2":{"34":9,"48":1}}],["aarch64",{"2":{"21":1,"40":4,"41":1}}],["apache",{"2":{"91":1,"92":1,"93":1}}],["apt",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1}}],["app",{"2":{"12":5,"33":1,"34":10,"63":1}}],["appmethod",{"2":{"9":1,"12":2}}],["attr",{"2":{"9":1,"12":1,"34":2,"48":3}}],["a",{"2":{"7":1}}],["button",{"2":{"95":1}}],["bus",{"2":{"95":1}}],["btn",{"2":{"48":1,"126":1}}],["bool",{"2":{"34":4,"87":2}}],["bin",{"2":{"34":1,"91":1,"92":1,"93":1}}],["basemethod",{"2":{"126":2}}],["baselog",{"2":{"91":2,"92":2,"93":2}}],["base",{"2":{"33":1,"63":1,"91":6,"108":2,"124":2,"126":1,"127":1,"128":2}}],["basecase",{"2":{"33":3,"127":2,"128":5}}],["bashcd",{"2":{"57":1}}],["bashmkdir",{"2":{"57":1}}],["bashmy",{"2":{"15":1,"18":1}}],["bashpip",{"2":{"56":5}}],["bashpython3",{"2":{"42":1}}],["bash$",{"2":{"52":1,"59":2,"61":2,"62":4,"63":2,"64":2,"65":2,"66":2,"67":6,"72":3,"75":2}}],["bash",{"2":{"46":1}}],["bashyouqu3",{"2":{"16":2,"19":2,"46":1,"49":2,"50":1,"51":1}}],["bash>>",{"2":{"12":1}}],["bar",{"2":{"3":1,"6":1}}],["by",{"2":{"9":1,"12":1,"34":6,"48":3}}],["because",{"2":{"7":1}}],["警告信息",{"2":{"7":1}}],["收集器节点的列表",{"2":{"5":1}}],["source",{"2":{"76":1,"88":1}}],["software",{"2":{"34":1,"91":2,"92":2,"93":2}}],["smoke",{"2":{"63":4,"65":2}}],["slaves",{"2":{"46":3}}],["slaves对象提供远程机器信息",{"0":{"46":1}}],["sleep",{"2":{"21":3}}],["systemctl",{"2":{"72":1}}],["system",{"2":{"40":1}}],["s",{"2":{"40":1}}],["skipif",{"2":{"40":8,"41":6}}],["skiped",{"2":{"39":1}}],["skip",{"2":{"36":1,"38":1,"39":2,"42":3,"43":1}}],["skipped",{"2":{"4":1}}],["similarity=similarity",{"2":{"34":2}}],["similarity=0",{"2":{"34":2,"87":1}}],["similarity",{"2":{"34":1,"87":1}}],["screen",{"2":{"34":8}}],["spdx",{"2":{"34":2,"91":2,"92":2,"93":2}}],["ssh",{"2":{"27":1,"72":3}}],["sw64",{"2":{"40":4}}],["sw",{"2":{"21":1}}],["sudo权限执行",{"0":{"26":1,"30":1}}],["sudo",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1,"40":1,"72":1}}],["summary",{"0":{"4":1},"2":{"2":2}}],["shell$",{"2":{"123":1}}],["shellpip",{"2":{"101":1}}],["shelluos",{"2":{"99":1,"108":1}}],["shellocr",{"2":{"87":1}}],["shellautotest",{"2":{"63":1,"124":1}}],["shell",{"0":{"52":1},"2":{"16":1,"19":1,"50":1,"52":2}}],["str",{"2":{"34":6}}],["step",{"2":{"12":1}}],["static",{"2":{"91":4,"92":2,"124":1,"129":1}}],["staticmethod",{"2":{"34":14,"91":2,"92":1}}],["status",{"2":{"34":2,"127":1}}],["start",{"2":{"15":2,"16":3,"18":1}}],["startswith",{"2":{"11":1,"94":2}}],["stage",{"2":{"6":3}}],["server",{"2":{"78":1,"79":8,"83":1}}],["secret",{"2":{"27":1}}],["setting",{"2":{"11":5,"34":6,"79":2,"83":3,"91":2,"92":2,"93":2,"94":6,"119":2}}],["setattr",{"2":{"10":1}}],["setup",{"2":{"6":1}}],["self",{"2":{"9":1,"12":1,"33":3,"48":4,"62":2,"91":8,"126":1,"127":2,"128":1}}],["fr",{"2":{"87":1}}],["from",{"2":{"12":2,"33":3,"34":17,"48":2,"79":2,"83":1,"91":3,"92":3,"93":3,"109":1,"126":2,"127":2,"128":3}}],["false",{"2":{"34":11,"41":2}}],["fail",{"2":{"6":2}}],["failed",{"2":{"4":1,"6":1}}],["float",{"2":{"34":13,"87":1}}],["fixture",{"2":{"124":1}}],["fixed",{"2":{"36":1,"42":3,"43":1}}],["filter",{"2":{"34":2}}],["file",{"2":{"34":14,"48":2,"94":2,"99":2,"100":2,"101":1,"108":2,"109":1,"126":1,"127":2}}],["filecopyrighttext",{"2":{"34":1,"91":1,"92":1,"93":1}}],["first=true",{"2":{"87":2}}],["first=return",{"2":{"34":2}}],["first=false",{"2":{"34":2}}],["first",{"2":{"34":3,"87":1}}],["find",{"2":{"12":4,"34":6}}],["f",{"2":{"12":1,"34":34,"67":6}}],["funnylog2",{"2":{"95":1}}],["funnylog",{"0":{"88":1},"1":{"89":1,"90":1,"91":1,"92":1,"93":1,"94":1},"2":{"11":1,"88":1,"89":1,"91":3,"92":3,"93":3,"94":3}}],["func",{"2":{"10":1}}],["foo0",{"2":{"6":1}}],["foo",{"2":{"3":1,"6":3,"7":2}}],["汇总信息",{"2":{"4":1}}],["2024",{"2":{"111":1}}],["2021",{"2":{"111":1}}],["2023",{"2":{"34":1,"91":1,"92":1,"93":1,"111":1}}],["28",{"2":{"12":1}}],["22",{"2":{"3":1}}],["2",{"0":{"40":1,"80":1,"83":1,"84":2,"85":1,"86":1,"87":1,"92":1,"98":1,"99":1,"100":2,"107":1,"108":1,"109":2,"112":1,"115":1,"119":1,"125":1,"126":1,"127":2,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1},"1":{"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"99":1,"100":1,"108":1,"109":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"135":1,"136":1,"137":1},"2":{"3":1,"4":2,"21":3,"34":1,"37":1,"46":2,"62":1,"74":1,"75":2,"95":1,"111":2,"124":1}}],["55",{"2":{"48":1}}],["50",{"2":{"6":1,"75":1}}],["5",{"0":{"87":1,"103":1,"122":1,"130":1,"134":1},"1":{"135":1,"136":1,"137":1},"2":{"3":2,"21":3,"95":1,"111":1}}],["56",{"2":{"3":1}}],["wdotool",{"2":{"95":1}}],["w5821",{"2":{"40":1}}],["widget",{"2":{"34":18,"48":1}}],["with",{"2":{"3":1}}],["web",{"2":{"54":1,"95":2,"135":1}}],["webassert",{"2":{"33":2}}],["webui",{"2":{"33":1,"56":2}}],["wayland",{"2":{"40":1,"41":1,"95":1}}],["want",{"2":{"16":1,"19":1}}],["warnings",{"0":{"7":1},"2":{"2":2}}],["what",{"2":{"16":1,"19":1}}],["x11",{"2":{"40":1}}],["xdg",{"2":{"40":1,"41":1}}],["xdist",{"2":{"3":1}}],["x3c",{"2":{"34":19}}],["x",{"2":{"12":2,"34":4}}],["xxx",{"2":{"9":1,"11":3,"12":1,"33":1,"36":3,"39":1,"42":2,"62":7,"94":1}}],["xxxx",{"2":{"0":1}}],["xpassed",{"2":{"4":1}}],["xfailed",{"2":{"4":1}}],["x86",{"2":{"3":1,"12":1,"40":2}}],["9",{"2":{"3":1,"12":2,"95":1}}],["7",{"0":{"132":1},"2":{"48":1,"95":1}}],["78",{"2":{"3":1}}],["7981803",{"2":{"2":1}}],["40",{"2":{"34":6}}],["47",{"2":{"12":1}}],["48",{"2":{"12":1}}],["4",{"0":{"86":1,"102":1,"117":1,"118":1,"119":1,"120":1,"121":2,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":2,"130":1,"131":1,"132":1,"133":1},"1":{"118":1,"119":1,"120":1,"121":1,"122":1,"124":1,"125":1,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"133":2,"135":1,"136":1,"137":1},"2":{"3":3,"95":1}}],["679537",{"2":{"39":1,"42":1,"43":1}}],["64",{"2":{"3":1,"12":1,"21":2,"40":2}}],["6",{"0":{"104":1,"131":1},"2":{"3":2,"12":1,"34":2,"87":1,"95":1}}],["3",{"0":{"41":1,"85":1,"93":1,"101":1,"113":1,"114":1,"115":1,"116":2,"117":1,"118":1,"119":1,"120":2,"121":1,"122":1,"128":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":2,"119":2,"120":2,"121":2,"122":2},"2":{"3":2,"4":1,"95":1}}],["public",{"0":{"104":1},"2":{"104":4}}],["pr",{"2":{"102":2}}],["project",{"2":{"48":2}}],["product",{"2":{"40":1}}],["process",{"2":{"34":4,"127":1}}],["popmethod",{"2":{"126":1}}],["po",{"2":{"100":1,"114":1,"126":1}}],["port",{"2":{"79":1,"83":1}}],["pms",{"2":{"95":2}}],["pdocr",{"0":{"76":1},"1":{"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1},"2":{"76":1,"78":1,"79":3,"81":1,"83":2,"95":1}}],["pip",{"2":{"56":1,"101":1}}],["picture",{"2":{"34":13,"84":1,"86":1}}],["pic",{"2":{"12":1,"34":14}}],["png",{"2":{"12":2,"34":4,"84":2,"86":1}}],["playwright",{"2":{"95":2}}],["platform",{"2":{"3":1,"40":5,"41":1}}],["plugins",{"2":{"3":1}}],["pluggy",{"2":{"3":1}}],["pypi",{"2":{"101":1}}],["pydbussend",{"2":{"95":1}}],["pylinuxauto",{"2":{"34":14,"95":1,"109":1}}],["py",{"2":{"3":1,"6":2,"7":2,"12":2,"15":2,"16":1,"18":2,"19":1,"33":3,"37":2,"41":2,"42":1,"48":1,"62":2,"63":4,"64":2,"67":6,"79":2,"91":1,"92":1,"93":1,"99":6,"108":12,"124":11,"126":1,"127":1,"128":4}}],["pytest",{"2":{"3":1,"38":1,"65":2,"95":3,"108":1}}],["pythonocr",{"2":{"84":1,"85":1,"86":1,"87":3}}],["python3",{"2":{"16":1,"19":1,"34":1,"91":1,"92":1,"93":1}}],["pythondfmwidget",{"2":{"12":1}}],["pythonfrom",{"2":{"11":1,"21":2,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"79":1,"83":1,"94":3,"100":1,"101":1,"109":1}}],["pythonclass",{"2":{"9":1,"33":1}}],["python",{"2":{"3":1,"12":2,"33":2,"34":1,"48":1,"62":1,"79":1,"112":1,"114":1,"126":1,"127":1,"128":3}}],["paddleocr",{"2":{"76":1}}],["pause=pause",{"2":{"34":4}}],["pause",{"2":{"34":8}}],["pass",{"2":{"34":4}}],["password=",{"2":{"48":1}}],["password=password",{"2":{"48":1}}],["password2",{"2":{"46":1}}],["password1",{"2":{"46":2}}],["password",{"2":{"27":1,"29":1,"30":1,"31":1,"48":1}}],["passed",{"2":{"4":1}}],["param",{"2":{"12":2,"34":32}}],["packages",{"2":{"3":1}}],["path",{"2":{"2":1,"7":2,"12":1,"34":17,"48":1,"94":2}}],["cd",{"2":{"112":1}}],["ci",{"2":{"112":1}}],["center",{"2":{"95":1}}],["c",{"2":{"75":2}}],["cpu",{"2":{"40":3}}],["csv文件",{"2":{"37":1}}],["csv文件与脚本对应关系",{"0":{"37":1}}],["csv",{"2":{"36":1,"37":6,"38":2,"39":1,"40":1,"44":1,"65":1,"108":2,"124":1,"130":2}}],["ch",{"2":{"34":2,"87":2}}],["cmd",{"2":{"25":3,"26":3,"27":3,"29":1,"30":1,"31":1,"34":4}}],["cli",{"2":{"111":1}}],["click",{"2":{"9":1,"12":1,"48":3,"126":2,"127":1}}],["clone",{"2":{"16":1,"19":1}}],["cls",{"2":{"12":2,"34":1,"91":4}}],["classmethod",{"2":{"12":1,"34":1,"91":2}}],["class",{"2":{"7":1,"11":3,"12":2,"33":2,"34":1,"48":1,"62":1,"91":3,"92":3,"93":3,"94":4,"126":1,"127":1,"128":3}}],["cargo",{"0":{"51":1},"2":{"50":1,"51":2,"59":1,"61":1,"62":2,"63":1,"64":1,"65":1,"66":1,"67":3,"72":1,"75":1}}],["cache",{"2":{"34":5}}],["case",{"2":{"15":2,"18":2,"33":2,"63":2,"64":1,"67":8,"108":3,"109":1,"124":4,"126":1,"127":3,"128":3}}],["cannot",{"2":{"7":1}}],["call",{"2":{"6":1}}],["c1",{"2":{"7":1}}],["commit",{"2":{"95":2}}],["com",{"2":{"76":1,"88":1}}],["count",{"2":{"34":1}}],["co",{"2":{"34":1,"91":1,"92":1,"93":1}}],["coding",{"2":{"34":1,"91":1,"92":1,"93":1}}],["code",{"2":{"7":1,"76":1,"88":1}}],["consolepip",{"2":{"78":1,"81":1,"89":1}}],["constructor",{"2":{"7":1}}],["contain",{"2":{"11":1,"94":1}}],["conftest",{"2":{"124":1}}],["config",{"2":{"12":1,"48":2,"108":1,"124":1}}],["conf",{"2":{"11":1,"79":1,"83":1,"91":1,"92":1,"93":1,"94":3}}],["collect",{"2":{"7":1}}],["collected",{"2":{"4":1}}],["collectors",{"0":{"5":1},"2":{"2":2}}],["created",{"2":{"2":1}}],["e",{"2":{"72":2}}],["equal",{"2":{"34":2}}],["ele",{"2":{"126":1}}],["elementnotfound",{"2":{"34":1}}],["element",{"2":{"12":2,"34":8,"48":1}}],["elements",{"2":{"12":5}}],["elif",{"2":{"34":4}}],["else",{"2":{"34":8}}],["events=",{"2":{"27":1}}],["expr=",{"2":{"34":2}}],["expr",{"2":{"34":10}}],["expanduser",{"2":{"34":2}}],["expect",{"2":{"27":1,"31":1,"34":18}}],["expect交互",{"0":{"27":1,"31":1}}],["excel",{"2":{"44":1}}],["exception",{"2":{"34":6}}],["exceptions",{"2":{"34":13}}],["except",{"2":{"34":8}}],["exc",{"2":{"34":12}}],["exists",{"2":{"34":2}}],["exist",{"2":{"34":11}}],["exitcode",{"2":{"2":1}}],["en",{"2":{"87":1}}],["envx",{"2":{"50":2}}],["env",{"2":{"34":1,"91":1,"92":1,"93":1,"108":1,"124":1}}],["environment",{"0":{"3":1},"2":{"2":2}}],["end",{"2":{"18":1,"19":3}}],["endswith",{"2":{"11":1,"91":1,"92":1,"93":1,"94":1}}],["error",{"2":{"4":1,"11":1,"92":2,"93":2}}],["titlemethod",{"2":{"126":1}}],["timeout=timeout",{"2":{"34":4}}],["timeout",{"2":{"34":5}}],["time",{"2":{"21":1,"34":4}}],["tmp",{"2":{"94":1}}],["t",{"2":{"65":2,"66":2}}],["type",{"2":{"40":1,"41":1}}],["typing",{"2":{"34":1}}],["tags",{"0":{"69":1},"2":{"37":1,"68":1,"69":3}}],["txt",{"0":{"69":1,"70":1},"2":{"34":3,"68":3,"69":3,"74":1,"108":1,"124":1}}],["transfer",{"2":{"95":1}}],["trace",{"2":{"10":2}}],["true表示返回原始数据",{"2":{"87":1}}],["true",{"2":{"34":4,"41":2,"127":1}}],["try",{"2":{"34":4}}],["tuple",{"2":{"12":1,"34":2,"94":1}}],["templateelementfound",{"2":{"34":3}}],["templateelementnotfound",{"2":{"34":5}}],["technology",{"2":{"34":1,"91":1,"92":1,"93":1}}],["teardown",{"2":{"6":1}}],["testlog",{"2":{"91":7,"92":2,"93":1}}],["testmusic",{"2":{"64":1}}],["testmycase",{"2":{"33":1,"127":1}}],["testcase",{"2":{"62":1,"128":1}}],["testfoo",{"2":{"7":2}}],["test",{"2":{"6":8,"7":3,"33":1,"37":2,"62":7,"63":2,"64":2,"67":6,"84":2,"86":1,"94":1,"108":2,"124":2,"127":2,"128":2}}],["tests",{"0":{"6":1},"2":{"2":3,"7":1,"99":1}}],["toolkit",{"2":{"97":1,"99":1}}],["todo",{"2":{"31":1}}],["total",{"2":{"4":1}}],["to",{"2":{"2":1,"7":1}}],["rightmethod",{"2":{"126":1}}],["rm",{"0":{"53":1},"2":{"50":1,"53":1}}],["rpcgui",{"0":{"48":1},"2":{"48":2}}],["rpc",{"0":{"76":1},"1":{"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1},"2":{"45":2,"48":1,"76":2,"78":1,"79":3,"81":1,"83":2,"95":4}}],["raise",{"2":{"34":22}}],["rate=rate",{"2":{"34":2}}],["rate=0",{"2":{"12":1}}],["rate",{"2":{"12":1,"34":7}}],["run",{"2":{"16":2,"19":2,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"42":1,"46":1,"49":1,"51":1,"52":1,"59":3,"61":2,"62":4,"63":2,"64":2,"65":2,"66":2,"67":6}}],["requirements",{"2":{"108":1,"124":1}}],["readme",{"2":{"99":1,"108":1}}],["record",{"2":{"95":1}}],["recursive",{"2":{"34":1}}],["removed",{"2":{"36":1,"43":2}}],["remotemethod",{"2":{"48":2}}],["remote",{"2":{"29":1,"30":1,"31":1,"48":1,"56":1,"72":3,"75":2}}],["remotecmd",{"2":{"29":2,"30":2,"31":2}}],["retry=network",{"2":{"34":4}}],["retry",{"2":{"34":9}}],["return",{"2":{"12":2,"34":6,"87":5}}],["restart",{"2":{"48":2,"72":1}}],["restart=false",{"2":{"48":1}}],["res",{"2":{"12":1,"34":21,"124":3,"129":3}}],["report",{"2":{"0":2,"95":1}}],["rootdir",{"2":{"48":1}}],["root",{"2":{"2":1,"46":3}}],["16",{"2":{"95":1}}],["168",{"2":{"46":3,"83":1}}],["15",{"2":{"95":1}}],["1518371686",{"2":{"2":1}}],["14",{"2":{"95":1}}],["13",{"2":{"95":1}}],["12",{"2":{"95":1}}],["1235666275024414",{"2":{"2":1}}],["11",{"2":{"95":1}}],["192",{"2":{"46":3,"83":1}}],["17",{"2":{"12":1,"95":1}}],["1071",{"2":{"101":1}}],["1070",{"2":{"101":1}}],["100",{"2":{"75":3}}],["10",{"2":{"4":2,"48":1,"95":1}}],["1",{"0":{"39":1,"77":1,"83":1,"91":1,"97":1,"99":1,"106":1,"108":1,"111":1,"114":1,"118":1,"124":1,"126":1},"1":{"78":1,"79":1},"2":{"2":1,"3":4,"4":3,"21":3,"34":7,"37":1,"46":5,"48":1,"62":3,"83":1,"87":1,"95":1,"111":1,"124":1}}],["002",{"2":{"63":1,"67":2,"124":1}}],["001",{"2":{"12":2,"33":2,"36":1,"37":2,"40":1,"62":7,"63":1,"64":5,"67":4,"108":2,"124":1,"127":2,"128":2}}],["02",{"2":{"12":1}}],["0",{"2":{"2":1,"3":4,"12":1,"34":1,"83":1,"111":2}}],["报告中",{"2":{"12":1}}],["报告内容",{"0":{"1":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1}}],["报告",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"2":{"0":1}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/VPLocalSearchBox.CIKGtnGi.js b/assets/chunks/VPLocalSearchBox.uXxUzkwX.js similarity index 99% rename from assets/chunks/VPLocalSearchBox.CIKGtnGi.js rename to assets/chunks/VPLocalSearchBox.uXxUzkwX.js index 5d90de6..4b52700 100644 --- a/assets/chunks/VPLocalSearchBox.CIKGtnGi.js +++ b/assets/chunks/VPLocalSearchBox.uXxUzkwX.js @@ -1,4 +1,4 @@ -var Nt=Object.defineProperty;var kt=(o,e,t)=>e in o?Nt(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var Oe=(o,e,t)=>kt(o,typeof e!="symbol"?e+"":e,t);import{X as It,h as oe,y as $e,at as Dt,au as Ot,d as Rt,G as xe,av as tt,k as Fe,aw as _t,ax as Mt,z as Lt,ay as zt,l as Re,R as de,P as Ee,az as Pt,aA as Bt,Y as Vt,j as $t,aB as Wt,o as ee,b as jt,m as E,a1 as Kt,p as U,aC as Jt,aD as Ut,aE as Ht,c as re,n as rt,e as Se,E as at,F as nt,a as ve,t as pe,aF as Gt,q as qt,s as Qt,aG as it,a3 as Yt,aj as Zt,ap as Xt,aH as er,_ as tr}from"./framework.CoRJFuj9.js";import{u as rr,c as ar}from"./theme.15PVdnDQ.js";const nr={root:()=>It(()=>import("./@localSearchIndexroot.TVYJnTv-.js"),[])};/*! +var Nt=Object.defineProperty;var kt=(o,e,t)=>e in o?Nt(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var Oe=(o,e,t)=>kt(o,typeof e!="symbol"?e+"":e,t);import{X as It,h as oe,y as $e,at as Dt,au as Ot,d as Rt,G as xe,av as tt,k as Fe,aw as _t,ax as Mt,z as Lt,ay as zt,l as Re,R as de,P as Ee,az as Pt,aA as Bt,Y as Vt,j as $t,aB as Wt,o as ee,b as jt,m as E,a1 as Kt,p as U,aC as Jt,aD as Ut,aE as Ht,c as re,n as rt,e as Se,E as at,F as nt,a as ve,t as pe,aF as Gt,q as qt,s as Qt,aG as it,a3 as Yt,aj as Zt,ap as Xt,aH as er,_ as tr}from"./framework.CoRJFuj9.js";import{u as rr,c as ar}from"./theme.D89Al4wk.js";const nr={root:()=>It(()=>import("./@localSearchIndexroot.gI043LAz.js"),[])};/*! * tabbable 6.2.0 * @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE */var mt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Te=mt.join(","),yt=typeof Element>"u",ue=yt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ne=!yt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},ke=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},ir=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},gt=function(e,t,r){if(ke(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Te));return t&&ue.call(e,Te)&&n.unshift(e),n=n.filter(r),n},bt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!ke(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var h=ue.call(i,Te);h&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var d=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!ke(d,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(d&&v){var m=o(d===!0?i.children:d.children,!0,r);r.flatten?n.push.apply(n,m):n.push({scopeParent:i,candidates:m})}else a.unshift.apply(a,i.children)}}return n},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},se=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||ir(e))&&!wt(e)?0:e.tabIndex},or=function(e,t){var r=se(e);return r<0&&t&&!wt(e)?0:r},sr=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},xt=function(e){return e.tagName==="INPUT"},ur=function(e){return xt(e)&&e.type==="hidden"},lr=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},cr=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(ue.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var u=e.parentElement,l=Ne(e);if(u&&!u.shadowRoot&&n(u)===!0)return ot(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(vr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return ot(e);return!1},mr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},gr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,u=or(s,i),l=i?o(n.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:a,tabIndex:u,item:n,isScope:i,content:l})}),r.sort(sr).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},br=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:We.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:yr}):r=gt(e,t.includeContainer,We.bind(null,t)),gr(r)},wr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:Ie.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=gt(e,t.includeContainer,Ie.bind(null,t)),r},le=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ue.call(e,Te)===!1?!1:We(t,e)},xr=mt.concat("iframe").join(","),_e=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ue.call(e,xr)===!1?!1:Ie(t,e)};/*! diff --git a/assets/chunks/theme.15PVdnDQ.js b/assets/chunks/theme.D89Al4wk.js similarity index 99% rename from assets/chunks/theme.15PVdnDQ.js rename to assets/chunks/theme.D89Al4wk.js index 34ba074..ddfd7fb 100644 --- a/assets/chunks/theme.15PVdnDQ.js +++ b/assets/chunks/theme.D89Al4wk.js @@ -1,4 +1,4 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.CIKGtnGi.js","assets/chunks/framework.CoRJFuj9.js"])))=>i.map(i=>d[i]); -import{d as b,o as s,c as l,r as v,n as H,a as j,t as T,b as y,w as p,e as f,T as ze,_ as g,u as Re,i as jt,f as Ut,g as qe,h as E,j as le,k as L,l as Y,m as u,p as i,q as Z,s as X,v as ie,x as Fe,y as te,z as Ce,A as Ke,B as ut,C as Gt,D as ce,F as A,E as G,G as dt,H as Te,I as _,J as re,K as mt,L as fe,M as we,N as Me,O as Rt,P as xe,Q as qt,R as We,S as vt,U as Kt,V as Wt,W as Yt,X as pt,Y as ht,Z as ft,$ as Zt,a0 as Xt,a1 as Jt,a2 as Qt,a3 as en,a4 as Ve,a5 as tn}from"./framework.CoRJFuj9.js";const nn=b({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(n){return(e,t)=>(s(),l("span",{class:H(["VPBadge",e.type])},[v(e.$slots,"default",{},()=>[j(T(e.text),1)])],2))}}),on={key:0,class:"VPBackdrop"},an=b({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(n){return(e,t)=>(s(),y(ze,{name:"fade"},{default:p(()=>[e.show?(s(),l("div",on)):f("",!0)]),_:1}))}}),sn=g(an,[["__scopeId","data-v-7400d5fd"]]),z=Re;function rn(n,e){let t,o=!1;return()=>{t&&clearTimeout(t),o?t=setTimeout(n,e):(n(),(o=!0)&&setTimeout(()=>o=!1,e))}}function je(n){return/^\//.test(n)?n:`/${n}`}function Ye(n){const{pathname:e,search:t,hash:o,protocol:a}=new URL(n,"http://a.com");if(jt(n)||n.startsWith("#")||!a.startsWith("http")||!Ut(e))return n;const{site:r}=z(),c=e.endsWith("/")||e.endsWith(".html")?n:n.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${t}${o}`);return qe(c)}const Ze=E(le?location.hash:"");le&&window.addEventListener("hashchange",()=>{Ze.value=location.hash});function _e({removeCurrent:n=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:o,page:a,theme:r}=z(),c=L(()=>{var m,k;return{label:(m=t.value.locales[o.value])==null?void 0:m.label,link:((k=t.value.locales[o.value])==null?void 0:k.link)||(o.value==="root"?"/":`/${o.value}/`)}});return{localeLinks:L(()=>Object.entries(t.value.locales).flatMap(([m,k])=>n&&c.value.label===k.label?[]:{text:k.label,link:ln(k.link||(m==="root"?"/":`/${m}/`),r.value.i18nRouting!==!1&&e,a.value.relativePath.slice(c.value.link.length-1),!t.value.cleanUrls)+Ze.value})),currentLang:c}}function ln(n,e,t,o){return e?n.replace(/\/$/,"")+je(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,o?".html":"")):n}const cn=n=>(Z("data-v-922e1a30"),n=n(),X(),n),un={class:"NotFound"},dn={class:"code"},mn={class:"title"},vn=cn(()=>u("div",{class:"divider"},null,-1)),pn={class:"quote"},hn={class:"action"},fn=["href","aria-label"],_n=b({__name:"NotFound",setup(n){const{site:e,theme:t}=z(),{localeLinks:o}=_e({removeCurrent:!1}),a=E("/");return Y(()=>{var c;const r=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");o.value.length&&(a.value=((c=o.value.find(({link:d})=>d.startsWith(r)))==null?void 0:c.link)||o.value[0].link)}),(r,c)=>{var d,m,k,$,w;return s(),l("div",un,[u("p",dn,T(((d=i(t).notFound)==null?void 0:d.code)??"404"),1),u("h1",mn,T(((m=i(t).notFound)==null?void 0:m.title)??"PAGE NOT FOUND"),1),vn,u("blockquote",pn,T(((k=i(t).notFound)==null?void 0:k.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),u("div",hn,[u("a",{class:"link",href:i(qe)(a.value),"aria-label":(($=i(t).notFound)==null?void 0:$.linkLabel)??"go to home"},T(((w=i(t).notFound)==null?void 0:w.linkText)??"Take me home"),9,fn)])])}}}),gn=g(_n,[["__scopeId","data-v-922e1a30"]]);function _t(n,e){if(Array.isArray(n))return Le(n);if(n==null)return[];e=je(e);const t=Object.keys(n).sort((a,r)=>r.split("/").length-a.split("/").length).find(a=>e.startsWith(je(a))),o=t?n[t]:[];return Array.isArray(o)?Le(o):Le(o.items,o.base)}function bn(n){const e=[];let t=0;for(const o in n){const a=n[o];if(a.items){t=e.push(a);continue}e[t]||e.push({items:[]}),e[t].items.push(a)}return e}function kn(n){const e=[];function t(o){for(const a of o)a.text&&a.link&&e.push({text:a.text,link:a.link,docFooterText:a.docFooterText}),a.items&&t(a.items)}return t(n),e}function Ue(n,e){return Array.isArray(e)?e.some(t=>Ue(n,t)):ie(n,e.link)?!0:e.items?Ue(n,e.items):!1}function Le(n,e){return[...n].map(t=>{const o={...t},a=o.base||e;return a&&o.link&&(o.link=a+o.link),o.items&&(o.items=Le(o.items,a)),o})}function ne(){const{frontmatter:n,page:e,theme:t}=z(),o=Fe("(min-width: 960px)"),a=E(!1),r=L(()=>{const I=t.value.sidebar,N=e.value.relativePath;return I?_t(I,N):[]}),c=E(r.value);te(r,(I,N)=>{JSON.stringify(I)!==JSON.stringify(N)&&(c.value=r.value)});const d=L(()=>n.value.sidebar!==!1&&c.value.length>0&&n.value.layout!=="home"),m=L(()=>k?n.value.aside==null?t.value.aside==="left":n.value.aside==="left":!1),k=L(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:t.value.aside!==!1),$=L(()=>d.value&&o.value),w=L(()=>d.value?bn(c.value):[]);function S(){a.value=!0}function B(){a.value=!1}function V(){a.value?B():S()}return{isOpen:a,sidebar:c,sidebarGroups:w,hasSidebar:d,hasAside:k,leftAside:m,isSidebarEnabled:$,open:S,close:B,toggle:V}}function $n(n,e){let t;Ce(()=>{t=n.value?document.activeElement:void 0}),Y(()=>{window.addEventListener("keyup",o)}),Ke(()=>{window.removeEventListener("keyup",o)});function o(a){a.key==="Escape"&&n.value&&(e(),t==null||t.focus())}}function yn(n){const{page:e}=z(),t=E(!1),o=L(()=>n.value.collapsed!=null),a=L(()=>!!n.value.link),r=E(!1),c=()=>{r.value=ie(e.value.relativePath,n.value.link)};te([e,n,Ze],c),Y(c);const d=L(()=>r.value?!0:n.value.items?Ue(e.value.relativePath,n.value.items):!1),m=L(()=>!!(n.value.items&&n.value.items.length));Ce(()=>{t.value=!!(o.value&&n.value.collapsed)}),ut(()=>{(r.value||d.value)&&(t.value=!1)});function k(){o.value&&(t.value=!t.value)}return{collapsed:t,collapsible:o,isLink:a,isActiveLink:r,hasActiveLink:d,hasChildren:m,toggle:k}}function wn(){const{hasSidebar:n}=ne(),e=Fe("(min-width: 960px)"),t=Fe("(min-width: 1280px)");return{isAsideEnabled:L(()=>!t.value&&!e.value?!1:n.value?t.value:e.value)}}const Ge=[];function gt(n){return typeof n.outline=="object"&&!Array.isArray(n.outline)&&n.outline.label||n.outlineTitle||"On this page"}function Xe(n){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const o=Number(t.tagName[1]);return{element:t,title:Ln(t),link:"#"+t.id,level:o}});return Pn(e,n)}function Ln(n){let e="";for(const t of n.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function Pn(n,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,a]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;n=n.filter(c=>c.level>=o&&c.level<=a),Ge.length=0;for(const{element:c,link:d}of n)Ge.push({element:c,link:d});const r=[];e:for(let c=0;c=0;m--){const k=n[m];if(k.level{requestAnimationFrame(r),window.addEventListener("scroll",o)}),Gt(()=>{c(location.hash)}),Ke(()=>{window.removeEventListener("scroll",o)});function r(){if(!t.value)return;const d=(()=>{var I;const V=(I=document.querySelector("#VPContent .VPDoc"))==null?void 0:I.firstElementChild;return V?ot(V):78})(),m=window.scrollY,k=window.innerHeight,$=document.body.offsetHeight,w=Math.abs(m+k-$)<1,S=Ge.map(({element:V,link:I})=>({link:I,top:ot(V)})).filter(({top:V})=>!Number.isNaN(V)).sort((V,I)=>V.top-I.top);if(!S.length){c(null);return}if(m<1){c(null);return}if(w){c(S[S.length-1].link);return}let B=null;for(const{link:V,top:I}of S){if(I>m+d)break;B=V}c(B)}function c(d){a&&a.classList.remove("active"),d==null?a=null:a=n.value.querySelector(`a[href="${decodeURIComponent(d)}"]`);const m=a;m?(m.classList.add("active"),e.value.style.top=m.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function ot(n){let e=0;for(;n!==document.body;){if(n===null)return NaN;e+=n.offsetTop,n=n.offsetParent}return e}const Sn=["href","title"],zn=b({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(n){function e({target:t}){const o=t.href.split("#")[1],a=document.getElementById(decodeURIComponent(o));a==null||a.focus({preventScroll:!0})}return(t,o)=>{const a=ce("VPDocOutlineItem",!0);return s(),l("ul",{class:H(["VPDocOutlineItem",t.root?"root":"nested"])},[(s(!0),l(A,null,G(t.headers,({children:r,link:c,title:d})=>(s(),l("li",null,[u("a",{class:"outline-link",href:c,onClick:e,title:d},T(d),9,Sn),r!=null&&r.length?(s(),y(a,{key:0,headers:r},null,8,["headers"])):f("",!0)]))),256))],2)}}}),bt=g(zn,[["__scopeId","data-v-cf5865db"]]),Cn=n=>(Z("data-v-e2c17725"),n=n(),X(),n),Tn={class:"content"},Mn={class:"outline-title",role:"heading","aria-level":"2"},In={"aria-labelledby":"doc-outline-aria-label"},En=Cn(()=>u("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Nn=b({__name:"VPDocAsideOutline",setup(n){const{frontmatter:e,theme:t}=z(),o=dt([]);Te(()=>{o.value=Xe(e.value.outline??t.value.outline)});const a=E(),r=E();return Vn(a,r),(c,d)=>(s(),l("div",{class:H(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:a,role:"navigation"},[u("div",Tn,[u("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),u("div",Mn,T(i(gt)(i(t))),1),u("nav",In,[En,_(bt,{headers:o.value,root:!0},null,8,["headers"])])])],2))}}),Hn=g(Nn,[["__scopeId","data-v-e2c17725"]]),An={class:"VPDocAsideCarbonAds"},Bn=b({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(n){const e=()=>null;return(t,o)=>(s(),l("div",An,[_(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),On=n=>(Z("data-v-8b9c5d2d"),n=n(),X(),n),Dn={class:"VPDocAside"},Fn=On(()=>u("div",{class:"spacer"},null,-1)),xn=b({__name:"VPDocAside",setup(n){const{theme:e}=z();return(t,o)=>(s(),l("div",Dn,[v(t.$slots,"aside-top",{},void 0,!0),v(t.$slots,"aside-outline-before",{},void 0,!0),_(Hn),v(t.$slots,"aside-outline-after",{},void 0,!0),Fn,v(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(s(),y(Bn,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):f("",!0),v(t.$slots,"aside-ads-after",{},void 0,!0),v(t.$slots,"aside-bottom",{},void 0,!0)]))}}),jn=g(xn,[["__scopeId","data-v-8b9c5d2d"]]);function Un(){const{theme:n,page:e}=z();return L(()=>{const{text:t="Edit this page",pattern:o=""}=n.value.editLink||{};let a;return typeof o=="function"?a=o(e.value):a=o.replace(/:path/g,e.value.filePath),{url:a,text:t}})}function Gn(){const{page:n,theme:e,frontmatter:t}=z();return L(()=>{var m,k,$,w,S,B,V,I;const o=_t(e.value.sidebar,n.value.relativePath),a=kn(o),r=a.findIndex(N=>ie(n.value.relativePath,N.link)),c=((m=e.value.docFooter)==null?void 0:m.prev)===!1&&!t.value.prev||t.value.prev===!1,d=((k=e.value.docFooter)==null?void 0:k.next)===!1&&!t.value.next||t.value.next===!1;return{prev:c?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??(($=a[r-1])==null?void 0:$.docFooterText)??((w=a[r-1])==null?void 0:w.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((S=a[r-1])==null?void 0:S.link)},next:d?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((B=a[r+1])==null?void 0:B.docFooterText)??((V=a[r+1])==null?void 0:V.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((I=a[r+1])==null?void 0:I.link)}}})}const Rn={},qn={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Kn=u("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Wn=u("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Yn=[Kn,Wn];function Zn(n,e){return s(),l("svg",qn,Yn)}const Xn=g(Rn,[["render",Zn]]),K=b({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(n){const e=n,t=L(()=>e.tag??(e.href?"a":"span")),o=L(()=>e.href&&mt.test(e.href));return(a,r)=>(s(),y(re(t.value),{class:H(["VPLink",{link:a.href,"vp-external-link-icon":o.value,"no-icon":a.noIcon}]),href:a.href?i(Ye)(a.href):void 0,target:a.target??(o.value?"_blank":void 0),rel:a.rel??(o.value?"noreferrer":void 0)},{default:p(()=>[v(a.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Jn={class:"VPLastUpdated"},Qn=["datetime"],eo=b({__name:"VPDocFooterLastUpdated",setup(n){const{theme:e,page:t,frontmatter:o,lang:a}=z(),r=L(()=>new Date(o.value.lastUpdated??t.value.lastUpdated)),c=L(()=>r.value.toISOString()),d=E("");return Y(()=>{Ce(()=>{var m,k,$;d.value=new Intl.DateTimeFormat((k=(m=e.value.lastUpdated)==null?void 0:m.formatOptions)!=null&&k.forceLocale?a.value:void 0,(($=e.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(r.value)})}),(m,k)=>{var $;return s(),l("p",Jn,[j(T((($=i(e).lastUpdated)==null?void 0:$.text)||i(e).lastUpdatedText||"Last updated")+": ",1),u("time",{datetime:c.value},T(d.value),9,Qn)])}}}),to=g(eo,[["__scopeId","data-v-42f5af39"]]),no={key:0,class:"VPDocFooter"},oo={key:0,class:"edit-info"},ao={key:0,class:"edit-link"},so={key:1,class:"last-updated"},ro={key:1,class:"prev-next"},io={class:"pager"},lo=["innerHTML"],co=["innerHTML"],uo={class:"pager"},mo=["innerHTML"],vo=["innerHTML"],po=b({__name:"VPDocFooter",setup(n){const{theme:e,page:t,frontmatter:o}=z(),a=Un(),r=Gn(),c=L(()=>e.value.editLink&&o.value.editLink!==!1),d=L(()=>t.value.lastUpdated&&o.value.lastUpdated!==!1),m=L(()=>c.value||d.value||r.value.prev||r.value.next);return(k,$)=>{var w,S,B,V;return m.value?(s(),l("footer",no,[v(k.$slots,"doc-footer-before",{},void 0,!0),c.value||d.value?(s(),l("div",oo,[c.value?(s(),l("div",ao,[_(K,{class:"edit-link-button",href:i(a).url,"no-icon":!0},{default:p(()=>[_(Xn,{class:"edit-link-icon","aria-label":"edit icon"}),j(" "+T(i(a).text),1)]),_:1},8,["href"])])):f("",!0),d.value?(s(),l("div",so,[_(to)])):f("",!0)])):f("",!0),(w=i(r).prev)!=null&&w.link||(S=i(r).next)!=null&&S.link?(s(),l("nav",ro,[u("div",io,[(B=i(r).prev)!=null&&B.link?(s(),y(K,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:p(()=>{var I;return[u("span",{class:"desc",innerHTML:((I=i(e).docFooter)==null?void 0:I.prev)||"Previous page"},null,8,lo),u("span",{class:"title",innerHTML:i(r).prev.text},null,8,co)]}),_:1},8,["href"])):f("",!0)]),u("div",uo,[(V=i(r).next)!=null&&V.link?(s(),y(K,{key:0,class:"pager-link next",href:i(r).next.link},{default:p(()=>{var I;return[u("span",{class:"desc",innerHTML:((I=i(e).docFooter)==null?void 0:I.next)||"Next page"},null,8,mo),u("span",{class:"title",innerHTML:i(r).next.text},null,8,vo)]}),_:1},8,["href"])):f("",!0)])])):f("",!0)])):f("",!0)}}}),ho=g(po,[["__scopeId","data-v-c6c7078a"]]),fo=n=>(Z("data-v-c1252fdc"),n=n(),X(),n),_o={class:"container"},go=fo(()=>u("div",{class:"aside-curtain"},null,-1)),bo={class:"aside-container"},ko={class:"aside-content"},$o={class:"content"},yo={class:"content-container"},wo={class:"main"},Lo=b({__name:"VPDoc",setup(n){const{theme:e}=z(),t=fe(),{hasSidebar:o,hasAside:a,leftAside:r}=ne(),c=L(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(d,m)=>{const k=ce("Content");return s(),l("div",{class:H(["VPDoc",{"has-sidebar":i(o),"has-aside":i(a)}])},[v(d.$slots,"doc-top",{},void 0,!0),u("div",_o,[i(a)?(s(),l("div",{key:0,class:H(["aside",{"left-aside":i(r)}])},[go,u("div",bo,[u("div",ko,[_(jn,null,{"aside-top":p(()=>[v(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[v(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[v(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),u("div",$o,[u("div",yo,[v(d.$slots,"doc-before",{},void 0,!0),u("main",wo,[_(k,{class:H(["vp-doc",[c.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),_(ho,null,{"doc-footer-before":p(()=>[v(d.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),v(d.$slots,"doc-after",{},void 0,!0)])])]),v(d.$slots,"doc-bottom",{},void 0,!0)],2)}}}),Po=g(Lo,[["__scopeId","data-v-c1252fdc"]]),Vo=b({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(n){const e=n,t=L(()=>e.href&&mt.test(e.href)),o=L(()=>e.tag||e.href?"a":"button");return(a,r)=>(s(),y(re(o.value),{class:H(["VPButton",[a.size,a.theme]]),href:a.href?i(Ye)(a.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:p(()=>[j(T(a.text),1)]),_:1},8,["class","href","target","rel"]))}}),So=g(Vo,[["__scopeId","data-v-5a0572b2"]]),zo=["src","alt"],Co=b({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(n){return(e,t)=>{const o=ce("VPImage",!0);return e.image?(s(),l(A,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),l("img",we({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(qe)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,zo)):(s(),l(A,{key:1},[_(o,we({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),_(o,we({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}}),Se=g(Co,[["__scopeId","data-v-52554789"]]),To=n=>(Z("data-v-27e36ebe"),n=n(),X(),n),Mo={class:"container"},Io={class:"main"},Eo={key:0,class:"name"},No=["innerHTML"],Ho=["innerHTML"],Ao=["innerHTML"],Bo={key:0,class:"actions"},Oo={key:0,class:"image"},Do={class:"image-container"},Fo=To(()=>u("div",{class:"image-bg"},null,-1)),xo=b({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(n){const e=Me("hero-image-slot-exists");return(t,o)=>(s(),l("div",{class:H(["VPHero",{"has-image":t.image||i(e)}])},[u("div",Mo,[u("div",Io,[v(t.$slots,"home-hero-info",{},()=>[t.name?(s(),l("h1",Eo,[u("span",{innerHTML:t.name,class:"clip"},null,8,No)])):f("",!0),t.text?(s(),l("p",{key:1,innerHTML:t.text,class:"text"},null,8,Ho)):f("",!0),t.tagline?(s(),l("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Ao)):f("",!0)],!0),t.actions?(s(),l("div",Bo,[(s(!0),l(A,null,G(t.actions,a=>(s(),l("div",{key:a.link,class:"action"},[_(So,{tag:"a",size:"medium",theme:a.theme,text:a.text,href:a.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||i(e)?(s(),l("div",Oo,[u("div",Do,[Fo,v(t.$slots,"home-hero-image",{},()=>[t.image?(s(),y(Se,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}}),jo=g(xo,[["__scopeId","data-v-27e36ebe"]]),Uo=b({__name:"VPHomeHero",setup(n){const{frontmatter:e}=z();return(t,o)=>i(e).hero?(s(),y(jo,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info":p(()=>[v(t.$slots,"home-hero-info")]),"home-hero-image":p(()=>[v(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Go={},Ro={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},qo=u("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),Ko=[qo];function Wo(n,e){return s(),l("svg",Ro,Ko)}const Yo=g(Go,[["render",Wo]]),Zo={class:"box"},Xo={key:0,class:"icon"},Jo=["innerHTML"],Qo=["innerHTML"],ea=["innerHTML"],ta={key:4,class:"link-text"},na={class:"link-text-value"},oa=b({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(n){return(e,t)=>(s(),y(K,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:p(()=>[u("article",Zo,[typeof e.icon=="object"&&e.icon.wrap?(s(),l("div",Xo,[_(Se,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),y(Se,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),l("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Jo)):f("",!0),u("h2",{class:"title",innerHTML:e.title},null,8,Qo),e.details?(s(),l("p",{key:3,class:"details",innerHTML:e.details},null,8,ea)):f("",!0),e.linkText?(s(),l("div",ta,[u("p",na,[j(T(e.linkText)+" ",1),_(Yo,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),aa=g(oa,[["__scopeId","data-v-790a0f07"]]),sa={key:0,class:"VPFeatures"},ra={class:"container"},ia={class:"items"},la=b({__name:"VPFeatures",props:{features:{}},setup(n){const e=n,t=L(()=>{const o=e.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o>3)return"grid-4"}else return});return(o,a)=>o.features?(s(),l("div",sa,[u("div",ra,[u("div",ia,[(s(!0),l(A,null,G(o.features,r=>(s(),l("div",{key:r.title,class:H(["item",[t.value]])},[_(aa,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}}),ca=g(la,[["__scopeId","data-v-8c75346a"]]),ua=b({__name:"VPHomeFeatures",setup(n){const{frontmatter:e}=z();return(t,o)=>i(e).features?(s(),y(ca,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):f("",!0)}}),da={class:"VPHome"},ma=b({__name:"VPHome",setup(n){return(e,t)=>{const o=ce("Content");return s(),l("div",da,[v(e.$slots,"home-hero-before",{},void 0,!0),_(Uo,null,{"home-hero-info":p(()=>[v(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),v(e.$slots,"home-hero-after",{},void 0,!0),v(e.$slots,"home-features-before",{},void 0,!0),_(ua),v(e.$slots,"home-features-after",{},void 0,!0),_(o)])}}}),va=g(ma,[["__scopeId","data-v-f308d76d"]]),pa={},ha={class:"VPPage"};function fa(n,e){const t=ce("Content");return s(),l("div",ha,[v(n.$slots,"page-top"),_(t),v(n.$slots,"page-bottom")])}const _a=g(pa,[["render",fa]]),ga=b({__name:"VPContent",setup(n){const{page:e,frontmatter:t}=z(),{hasSidebar:o}=ne();return(a,r)=>(s(),l("div",{class:H(["VPContent",{"has-sidebar":i(o),"is-home":i(t).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?v(a.$slots,"not-found",{key:0},()=>[_(gn)],!0):i(t).layout==="page"?(s(),y(_a,{key:1},{"page-top":p(()=>[v(a.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[v(a.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(s(),y(va,{key:2},{"home-hero-before":p(()=>[v(a.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[v(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(a.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[v(a.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[v(a.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[v(a.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(s(),y(re(i(t).layout),{key:3})):(s(),y(Po,{key:4},{"doc-top":p(()=>[v(a.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[v(a.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[v(a.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[v(a.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[v(a.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[v(a.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[v(a.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(a.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(a.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(a.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[v(a.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),ba=g(ga,[["__scopeId","data-v-d9b0d414"]]),ka={class:"container"},$a=["innerHTML"],ya=["innerHTML"],wa=b({__name:"VPFooter",setup(n){const{theme:e,frontmatter:t}=z(),{hasSidebar:o}=ne();return(a,r)=>i(e).footer&&i(t).footer!==!1?(s(),l("footer",{key:0,class:H(["VPFooter",{"has-sidebar":i(o)}])},[u("div",ka,[i(e).footer.message?(s(),l("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,$a)):f("",!0),i(e).footer.copyright?(s(),l("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,ya)):f("",!0)])],2)):f("",!0)}}),La=g(wa,[["__scopeId","data-v-83c9c484"]]);function kt(){const{theme:n,frontmatter:e}=z(),t=dt([]),o=L(()=>t.value.length>0);return Te(()=>{t.value=Xe(e.value.outline??n.value.outline)}),{headers:t,hasLocalNav:o}}const Pa={},Va={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Sa=u("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),za=[Sa];function Ca(n,e){return s(),l("svg",Va,za)}const $t=g(Pa,[["render",Ca]]),Ta={class:"header"},Ma={class:"outline"},Ia=b({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(n){const e=n,{theme:t}=z(),o=E(!1),a=E(0),r=E(),c=E();Rt(r,()=>{o.value=!1}),xe("Escape",()=>{o.value=!1}),Te(()=>{o.value=!1});function d(){o.value=!o.value,a.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function m($){$.target.classList.contains("outline-link")&&(c.value&&(c.value.style.transition="none"),We(()=>{o.value=!1}))}function k(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return($,w)=>(s(),l("div",{class:"VPLocalNavOutlineDropdown",style:qt({"--vp-vh":a.value+"px"}),ref_key:"main",ref:r},[$.headers.length>0?(s(),l("button",{key:0,onClick:d,class:H({open:o.value})},[j(T(i(gt)(i(t)))+" ",1),_($t,{class:"icon"})],2)):(s(),l("button",{key:1,onClick:k},T(i(t).returnToTopLabel||"Return to top"),1)),_(ze,{name:"flyout"},{default:p(()=>[o.value?(s(),l("div",{key:0,ref_key:"items",ref:c,class:"items",onClick:m},[u("div",Ta,[u("a",{class:"top-link",href:"#",onClick:k},T(i(t).returnToTopLabel||"Return to top"),1)]),u("div",Ma,[_(bt,{headers:$.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}}),Ea=g(Ia,[["__scopeId","data-v-2d2d5d54"]]),Na={},Ha={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Aa=u("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Ba=u("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Oa=u("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Da=u("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),Fa=[Aa,Ba,Oa,Da];function xa(n,e){return s(),l("svg",Ha,Fa)}const ja=g(Na,[["render",xa]]),Ua={class:"container"},Ga=["aria-expanded"],Ra={class:"menu-text"},qa=b({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(n){const{theme:e,frontmatter:t}=z(),{hasSidebar:o}=ne(),{headers:a}=kt(),{y:r}=vt(),c=E(0);Y(()=>{c.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Te(()=>{a.value=Xe(t.value.outline??e.value.outline)});const d=L(()=>a.value.length===0),m=L(()=>d.value&&!o.value),k=L(()=>({VPLocalNav:!0,"has-sidebar":o.value,empty:d.value,fixed:m.value}));return($,w)=>i(t).layout!=="home"&&(!m.value||i(r)>=c.value)?(s(),l("div",{key:0,class:H(k.value)},[u("div",Ua,[i(o)?(s(),l("button",{key:0,class:"menu","aria-expanded":$.open,"aria-controls":"VPSidebarNav",onClick:w[0]||(w[0]=S=>$.$emit("open-menu"))},[_(ja,{class:"menu-icon"}),u("span",Ra,T(i(e).sidebarMenuLabel||"Menu"),1)],8,Ga)):f("",!0),_(Ea,{headers:i(a),navHeight:c.value},null,8,["headers","navHeight"])])],2)):f("",!0)}}),Ka=g(qa,[["__scopeId","data-v-2158a76a"]]);function Wa(){const n=E(!1);function e(){n.value=!0,window.addEventListener("resize",a)}function t(){n.value=!1,window.removeEventListener("resize",a)}function o(){n.value?t():e()}function a(){window.outerWidth>=768&&t()}const r=fe();return te(()=>r.path,t),{isScreenOpen:n,openScreen:e,closeScreen:t,toggleScreen:o}}const Ya={},Za={class:"VPSwitch",type:"button",role:"switch"},Xa={class:"check"},Ja={key:0,class:"icon"};function Qa(n,e){return s(),l("button",Za,[u("span",Xa,[n.$slots.default?(s(),l("span",Ja,[v(n.$slots,"default",{},void 0,!0)])):f("",!0)])])}const es=g(Ya,[["render",Qa],["__scopeId","data-v-79d0ed95"]]),ts={},ns={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},os=u("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),as=[os];function ss(n,e){return s(),l("svg",ns,as)}const rs=g(ts,[["render",ss]]),is={},ls={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},cs=Kt('',9),us=[cs];function ds(n,e){return s(),l("svg",ls,us)}const ms=g(is,[["render",ds]]),vs=b({__name:"VPSwitchAppearance",setup(n){const{isDark:e,theme:t}=z(),o=Me("toggle-appearance",()=>{e.value=!e.value}),a=L(()=>e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme");return(r,c)=>(s(),y(es,{title:a.value,class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(o)},{default:p(()=>[_(ms,{class:"sun"}),_(rs,{class:"moon"})]),_:1},8,["title","aria-checked","onClick"]))}}),Je=g(vs,[["__scopeId","data-v-0298adb0"]]),ps={key:0,class:"VPNavBarAppearance"},hs=b({__name:"VPNavBarAppearance",setup(n){const{site:e}=z();return(t,o)=>i(e).appearance&&i(e).appearance!=="force-dark"?(s(),l("div",ps,[_(Je)])):f("",!0)}}),fs=g(hs,[["__scopeId","data-v-0e934124"]]),Qe=E();let yt=!1,Oe=0;function _s(n){const e=E(!1);if(le){!yt&&gs(),Oe++;const t=te(Qe,o=>{var a,r,c;o===n.el.value||(a=n.el.value)!=null&&a.contains(o)?(e.value=!0,(r=n.onFocus)==null||r.call(n)):(e.value=!1,(c=n.onBlur)==null||c.call(n))});Ke(()=>{t(),Oe--,Oe||bs()})}return Wt(e)}function gs(){document.addEventListener("focusin",wt),yt=!0,Qe.value=document.activeElement}function bs(){document.removeEventListener("focusin",wt)}function wt(){Qe.value=document.activeElement}const ks={},$s={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ys=u("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),ws=[ys];function Ls(n,e){return s(),l("svg",$s,ws)}const Lt=g(ks,[["render",Ls]]),Ps={},Vs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ss=u("circle",{cx:"12",cy:"12",r:"2"},null,-1),zs=u("circle",{cx:"19",cy:"12",r:"2"},null,-1),Cs=u("circle",{cx:"5",cy:"12",r:"2"},null,-1),Ts=[Ss,zs,Cs];function Ms(n,e){return s(),l("svg",Vs,Ts)}const Is=g(Ps,[["render",Ms]]),Es={class:"VPMenuLink"},Ns=b({__name:"VPMenuLink",props:{item:{}},setup(n){const{page:e}=z();return(t,o)=>(s(),l("div",Es,[_(K,{class:H({active:i(ie)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:p(()=>[j(T(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),Ie=g(Ns,[["__scopeId","data-v-9d1535a1"]]),Hs={class:"VPMenuGroup"},As={key:0,class:"title"},Bs=b({__name:"VPMenuGroup",props:{text:{},items:{}},setup(n){return(e,t)=>(s(),l("div",Hs,[e.text?(s(),l("p",As,T(e.text),1)):f("",!0),(s(!0),l(A,null,G(e.items,o=>(s(),l(A,null,["link"in o?(s(),y(Ie,{key:0,item:o},null,8,["item"])):f("",!0)],64))),256))]))}}),Os=g(Bs,[["__scopeId","data-v-c1904112"]]),Ds={class:"VPMenu"},Fs={key:0,class:"items"},xs=b({__name:"VPMenu",props:{items:{}},setup(n){return(e,t)=>(s(),l("div",Ds,[e.items?(s(),l("div",Fs,[(s(!0),l(A,null,G(e.items,o=>(s(),l(A,{key:o.text},["link"in o?(s(),y(Ie,{key:0,item:o},null,8,["item"])):(s(),y(Os,{key:1,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0),v(e.$slots,"default",{},void 0,!0)]))}}),js=g(xs,[["__scopeId","data-v-e699aa0c"]]),Us=["aria-expanded","aria-label"],Gs={key:0,class:"text"},Rs=["innerHTML"],qs={class:"menu"},Ks=b({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(n){const e=E(!1),t=E();_s({el:t,onBlur:o});function o(){e.value=!1}return(a,r)=>(s(),l("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:r[1]||(r[1]=c=>e.value=!0),onMouseleave:r[2]||(r[2]=c=>e.value=!1)},[u("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":a.label,onClick:r[0]||(r[0]=c=>e.value=!e.value)},[a.button||a.icon?(s(),l("span",Gs,[a.icon?(s(),y(re(a.icon),{key:0,class:"option-icon"})):f("",!0),a.button?(s(),l("span",{key:1,innerHTML:a.button},null,8,Rs)):f("",!0),_(Lt,{class:"text-icon"})])):(s(),y(Is,{key:1,class:"icon"}))],8,Us),u("div",qs,[_(js,{items:a.items},{default:p(()=>[v(a.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),et=g(Ks,[["__scopeId","data-v-eaf183b7"]]),Ws={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Ys=["href","aria-label","innerHTML"],Zs=b({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(n){const e=n,t=L(()=>typeof e.icon=="object"?e.icon.svg:Ws[e.icon]);return(o,a)=>(s(),l("a",{class:"VPSocialLink no-icon",href:o.link,"aria-label":o.ariaLabel??(typeof o.icon=="string"?o.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Ys))}}),Xs=g(Zs,[["__scopeId","data-v-f4d58015"]]),Js={class:"VPSocialLinks"},Qs=b({__name:"VPSocialLinks",props:{links:{}},setup(n){return(e,t)=>(s(),l("div",Js,[(s(!0),l(A,null,G(e.links,({link:o,icon:a,ariaLabel:r})=>(s(),y(Xs,{key:o,icon:a,link:o,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),Ee=g(Qs,[["__scopeId","data-v-20ea2c3a"]]),er={key:0,class:"group translations"},tr={class:"trans-title"},nr={key:1,class:"group"},or={class:"item appearance"},ar={class:"label"},sr={class:"appearance-action"},rr={key:2,class:"group"},ir={class:"item social-links"},lr=b({__name:"VPNavBarExtra",setup(n){const{site:e,theme:t}=z(),{localeLinks:o,currentLang:a}=_e({correspondingLink:!0}),r=L(()=>o.value.length&&a.value.label||e.value.appearance||t.value.socialLinks);return(c,d)=>r.value?(s(),y(et,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[i(o).length&&i(a).label?(s(),l("div",er,[u("p",tr,T(i(a).label),1),(s(!0),l(A,null,G(i(o),m=>(s(),y(Ie,{key:m.link,item:m},null,8,["item"]))),128))])):f("",!0),i(e).appearance&&i(e).appearance!=="force-dark"?(s(),l("div",nr,[u("div",or,[u("p",ar,T(i(t).darkModeSwitchLabel||"Appearance"),1),u("div",sr,[_(Je)])])])):f("",!0),i(t).socialLinks?(s(),l("div",rr,[u("div",ir,[_(Ee,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}}),cr=g(lr,[["__scopeId","data-v-a4952b56"]]),ur=n=>(Z("data-v-5df5a4ba"),n=n(),X(),n),dr=["aria-expanded"],mr=ur(()=>u("span",{class:"container"},[u("span",{class:"top"}),u("span",{class:"middle"}),u("span",{class:"bottom"})],-1)),vr=[mr],pr=b({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(n){return(e,t)=>(s(),l("button",{type:"button",class:H(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=o=>e.$emit("click"))},vr,10,dr))}}),hr=g(pr,[["__scopeId","data-v-5df5a4ba"]]),fr=["innerHTML"],_r=b({__name:"VPNavBarMenuLink",props:{item:{}},setup(n){const{page:e}=z();return(t,o)=>(s(),y(K,{class:H({VPNavBarMenuLink:!0,active:i(ie)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:p(()=>[u("span",{innerHTML:t.item.text},null,8,fr)]),_:1},8,["class","href","target","rel"]))}}),gr=g(_r,[["__scopeId","data-v-01a9a2a9"]]),br=b({__name:"VPNavBarMenuGroup",props:{item:{}},setup(n){const e=n,{page:t}=z(),o=r=>"link"in r?ie(t.value.relativePath,r.link,!!e.item.activeMatch):r.items.some(o),a=L(()=>o(e.item));return(r,c)=>(s(),y(et,{class:H({VPNavBarMenuGroup:!0,active:i(ie)(i(t).relativePath,r.item.activeMatch,!!r.item.activeMatch)||a.value}),button:r.item.text,items:r.item.items},null,8,["class","button","items"]))}}),kr=n=>(Z("data-v-10e7ffc9"),n=n(),X(),n),$r={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},yr=kr(()=>u("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),wr=b({__name:"VPNavBarMenu",setup(n){const{theme:e}=z();return(t,o)=>i(e).nav?(s(),l("nav",$r,[yr,(s(!0),l(A,null,G(i(e).nav,a=>(s(),l(A,{key:a.text},["link"in a?(s(),y(gr,{key:0,item:a},null,8,["item"])):(s(),y(br,{key:1,item:a},null,8,["item"]))],64))),128))])):f("",!0)}}),Lr=g(wr,[["__scopeId","data-v-10e7ffc9"]]);function Pr(n){const{localeIndex:e,theme:t}=z();function o(a){var V,I,N;const r=a.split("."),c=(V=t.value.search)==null?void 0:V.options,d=c&&typeof c=="object",m=d&&((N=(I=c.locales)==null?void 0:I[e.value])==null?void 0:N.translations)||null,k=d&&c.translations||null;let $=m,w=k,S=n;const B=r.pop();for(const ue of r){let J=null;const F=S==null?void 0:S[ue];F&&(J=S=F);const oe=w==null?void 0:w[ue];oe&&(J=w=oe);const Q=$==null?void 0:$[ue];Q&&(J=$=Q),F||(S=J),oe||(w=J),Q||($=J)}return($==null?void 0:$[B])??(w==null?void 0:w[B])??(S==null?void 0:S[B])??""}return o}const Vr=["aria-label"],Sr={class:"DocSearch-Button-Container"},zr=u("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[u("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Cr={class:"DocSearch-Button-Placeholder"},Tr=u("span",{class:"DocSearch-Button-Keys"},[u("kbd",{class:"DocSearch-Button-Key"}),u("kbd",{class:"DocSearch-Button-Key"},"K")],-1),at=b({__name:"VPNavBarSearchButton",setup(n){const t=Pr({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(o,a)=>(s(),l("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(t)("button.buttonAriaLabel")},[u("span",Sr,[zr,u("span",Cr,T(i(t)("button.buttonText")),1)]),Tr],8,Vr))}}),Mr={class:"VPNavBarSearch"},Ir={id:"local-search"},Er={key:1,id:"docsearch"},Nr=b({__name:"VPNavBarSearch",setup(n){const e=Yt(()=>pt(()=>import("./VPLocalSearchBox.CIKGtnGi.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:o}=z(),a=E(!1),r=E(!1);Y(()=>{});function c(){a.value||(a.value=!0,setTimeout(d,16))}function d(){const w=new Event("keydown");w.key="k",w.metaKey=!0,window.dispatchEvent(w),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||d()},16)}function m(w){const S=w.target,B=S.tagName;return S.isContentEditable||B==="INPUT"||B==="SELECT"||B==="TEXTAREA"}const k=E(!1);xe("k",w=>{(w.ctrlKey||w.metaKey)&&(w.preventDefault(),k.value=!0)}),xe("/",w=>{m(w)||(w.preventDefault(),k.value=!0)});const $="local";return(w,S)=>{var B;return s(),l("div",Mr,[i($)==="local"?(s(),l(A,{key:0},[k.value?(s(),y(i(e),{key:0,onClose:S[0]||(S[0]=V=>k.value=!1)})):f("",!0),u("div",Ir,[_(at,{onClick:S[1]||(S[1]=V=>k.value=!0)})])],64)):i($)==="algolia"?(s(),l(A,{key:1},[a.value?(s(),y(i(t),{key:0,algolia:((B=i(o).search)==null?void 0:B.options)??i(o).algolia,onVnodeBeforeMount:S[2]||(S[2]=V=>r.value=!0)},null,8,["algolia"])):f("",!0),r.value?f("",!0):(s(),l("div",Er,[_(at,{onClick:c})]))],64)):f("",!0)])}}}),Hr=b({__name:"VPNavBarSocialLinks",setup(n){const{theme:e}=z();return(t,o)=>i(e).socialLinks?(s(),y(Ee,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):f("",!0)}}),Ar=g(Hr,[["__scopeId","data-v-17479deb"]]),Br=["href","rel","target"],Or=b({__name:"VPNavBarTitle",setup(n){const{site:e,theme:t}=z(),{hasSidebar:o}=ne(),{currentLang:a}=_e(),r=L(()=>{var m;return typeof t.value.logoLink=="string"?t.value.logoLink:(m=t.value.logoLink)==null?void 0:m.link}),c=L(()=>{var m;return typeof t.value.logoLink=="string"||(m=t.value.logoLink)==null?void 0:m.rel}),d=L(()=>{var m;return typeof t.value.logoLink=="string"||(m=t.value.logoLink)==null?void 0:m.target});return(m,k)=>(s(),l("div",{class:H(["VPNavBarTitle",{"has-sidebar":i(o)}])},[u("a",{class:"title",href:r.value??i(Ye)(i(a).link),rel:c.value,target:d.value},[v(m.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(s(),y(Se,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):f("",!0),i(t).siteTitle?(s(),l(A,{key:1},[j(T(i(t).siteTitle),1)],64)):i(t).siteTitle===void 0?(s(),l(A,{key:2},[j(T(i(e).title),1)],64)):f("",!0),v(m.$slots,"nav-bar-title-after",{},void 0,!0)],8,Br)],2))}}),Dr=g(Or,[["__scopeId","data-v-2256aec7"]]),Fr={},xr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},jr=u("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Ur=u("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Gr=[jr,Ur];function Rr(n,e){return s(),l("svg",xr,Gr)}const Pt=g(Fr,[["render",Rr]]),qr={class:"items"},Kr={class:"title"},Wr=b({__name:"VPNavBarTranslations",setup(n){const{theme:e}=z(),{localeLinks:t,currentLang:o}=_e({correspondingLink:!0});return(a,r)=>i(t).length&&i(o).label?(s(),y(et,{key:0,class:"VPNavBarTranslations",icon:Pt,label:i(e).langMenuLabel||"Change language"},{default:p(()=>[u("div",qr,[u("p",Kr,T(i(o).label),1),(s(!0),l(A,null,G(i(t),c=>(s(),y(Ie,{key:c.link,item:c},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}}),Yr=g(Wr,[["__scopeId","data-v-56a52592"]]),Zr=n=>(Z("data-v-9ec51abf"),n=n(),X(),n),Xr={class:"wrapper"},Jr={class:"container"},Qr={class:"title"},ei={class:"content"},ti={class:"content-body"},ni=Zr(()=>u("div",{class:"divider"},[u("div",{class:"divider-line"})],-1)),oi=b({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(n){const{y:e}=vt(),{hasSidebar:t}=ne(),{hasLocalNav:o}=kt(),{frontmatter:a}=z(),r=E({});return ut(()=>{r.value={"has-sidebar":t.value,"has-local-nav":o.value,top:a.value.layout==="home"&&e.value===0}}),(c,d)=>(s(),l("div",{class:H(["VPNavBar",r.value])},[u("div",Xr,[u("div",Jr,[u("div",Qr,[_(Dr,null,{"nav-bar-title-before":p(()=>[v(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(c.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),u("div",ei,[u("div",ti,[v(c.$slots,"nav-bar-content-before",{},void 0,!0),_(Nr,{class:"search"}),_(Lr,{class:"menu"}),_(Yr,{class:"translations"}),_(fs,{class:"appearance"}),_(Ar,{class:"social-links"}),_(cr,{class:"extra"}),v(c.$slots,"nav-bar-content-after",{},void 0,!0),_(hr,{class:"hamburger",active:c.isScreenOpen,onClick:d[0]||(d[0]=m=>c.$emit("toggle-screen"))},null,8,["active"])])])])]),ni],2))}}),ai=g(oi,[["__scopeId","data-v-9ec51abf"]]),si={key:0,class:"VPNavScreenAppearance"},ri={class:"text"},ii=b({__name:"VPNavScreenAppearance",setup(n){const{site:e,theme:t}=z();return(o,a)=>i(e).appearance&&i(e).appearance!=="force-dark"?(s(),l("div",si,[u("p",ri,T(i(t).darkModeSwitchLabel||"Appearance"),1),_(Je)])):f("",!0)}}),li=g(ii,[["__scopeId","data-v-2f05ca60"]]),ci=b({__name:"VPNavScreenMenuLink",props:{item:{}},setup(n){const e=Me("close-screen");return(t,o)=>(s(),y(K,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:p(()=>[j(T(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),ui=g(ci,[["__scopeId","data-v-13a0f76d"]]),di={},mi={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},vi=u("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),pi=[vi];function hi(n,e){return s(),l("svg",mi,pi)}const fi=g(di,[["render",hi]]),_i=b({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(n){const e=Me("close-screen");return(t,o)=>(s(),y(K,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:p(()=>[j(T(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Vt=g(_i,[["__scopeId","data-v-a77909ab"]]),gi={class:"VPNavScreenMenuGroupSection"},bi={key:0,class:"title"},ki=b({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(n){return(e,t)=>(s(),l("div",gi,[e.text?(s(),l("p",bi,T(e.text),1)):f("",!0),(s(!0),l(A,null,G(e.items,o=>(s(),y(Vt,{key:o.text,item:o},null,8,["item"]))),128))]))}}),$i=g(ki,[["__scopeId","data-v-02647012"]]),yi=["aria-controls","aria-expanded"],wi=["innerHTML"],Li=["id"],Pi={key:1,class:"group"},Vi=b({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(n){const e=n,t=E(!1),o=L(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function a(){t.value=!t.value}return(r,c)=>(s(),l("div",{class:H(["VPNavScreenMenuGroup",{open:t.value}])},[u("button",{class:"button","aria-controls":o.value,"aria-expanded":t.value,onClick:a},[u("span",{class:"button-text",innerHTML:r.text},null,8,wi),_(fi,{class:"button-icon"})],8,yi),u("div",{id:o.value,class:"items"},[(s(!0),l(A,null,G(r.items,d=>(s(),l(A,{key:d.text},["link"in d?(s(),l("div",{key:d.text,class:"item"},[_(Vt,{item:d},null,8,["item"])])):(s(),l("div",Pi,[_($i,{text:d.text,items:d.items},null,8,["text","items"])]))],64))),128))],8,Li)],2))}}),Si=g(Vi,[["__scopeId","data-v-add8adf0"]]),zi={key:0,class:"VPNavScreenMenu"},Ci=b({__name:"VPNavScreenMenu",setup(n){const{theme:e}=z();return(t,o)=>i(e).nav?(s(),l("nav",zi,[(s(!0),l(A,null,G(i(e).nav,a=>(s(),l(A,{key:a.text},["link"in a?(s(),y(ui,{key:0,item:a},null,8,["item"])):(s(),y(Si,{key:1,text:a.text||"",items:a.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Ti=b({__name:"VPNavScreenSocialLinks",setup(n){const{theme:e}=z();return(t,o)=>i(e).socialLinks?(s(),y(Ee,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):f("",!0)}}),Mi={class:"list"},Ii=b({__name:"VPNavScreenTranslations",setup(n){const{localeLinks:e,currentLang:t}=_e({correspondingLink:!0}),o=E(!1);function a(){o.value=!o.value}return(r,c)=>i(e).length&&i(t).label?(s(),l("div",{key:0,class:H(["VPNavScreenTranslations",{open:o.value}])},[u("button",{class:"title",onClick:a},[_(Pt,{class:"icon lang"}),j(" "+T(i(t).label)+" ",1),_(Lt,{class:"icon chevron"})]),u("ul",Mi,[(s(!0),l(A,null,G(i(e),d=>(s(),l("li",{key:d.link,class:"item"},[_(K,{class:"link",href:d.link},{default:p(()=>[j(T(d.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}}),Ei=g(Ii,[["__scopeId","data-v-e924fe42"]]),Ni={class:"container"},Hi=b({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(n){const e=E(null),t=ht(le?document.body:null);return(o,a)=>(s(),y(ze,{name:"fade",onEnter:a[0]||(a[0]=r=>t.value=!0),onAfterLeave:a[1]||(a[1]=r=>t.value=!1)},{default:p(()=>[o.open?(s(),l("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[u("div",Ni,[v(o.$slots,"nav-screen-content-before",{},void 0,!0),_(Ci,{class:"menu"}),_(Ei,{class:"translations"}),_(li,{class:"appearance"}),_(Ti,{class:"social-links"}),v(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}}),Ai=g(Hi,[["__scopeId","data-v-b4543032"]]),Bi={key:0,class:"VPNav"},Oi=b({__name:"VPNav",setup(n){const{isScreenOpen:e,closeScreen:t,toggleScreen:o}=Wa(),{frontmatter:a}=z(),r=L(()=>a.value.navbar!==!1);return ft("close-screen",t),Ce(()=>{le&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(c,d)=>r.value?(s(),l("header",Bi,[_(ai,{"is-screen-open":i(e),onToggleScreen:i(o)},{"nav-bar-title-before":p(()=>[v(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(c.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[v(c.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[v(c.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),_(Ai,{open:i(e)},{"nav-screen-content-before":p(()=>[v(c.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[v(c.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}}),Di=g(Oi,[["__scopeId","data-v-ca0a69ce"]]),Fi=n=>(Z("data-v-eb64199c"),n=n(),X(),n),xi=["role","tabindex"],ji=Fi(()=>u("div",{class:"indicator"},null,-1)),Ui={key:1,class:"items"},Gi=b({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(n){const e=n,{collapsed:t,collapsible:o,isLink:a,isActiveLink:r,hasActiveLink:c,hasChildren:d,toggle:m}=yn(L(()=>e.item)),k=L(()=>d.value?"section":"div"),$=L(()=>a.value?"a":"div"),w=L(()=>d.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),S=L(()=>a.value?void 0:"button"),B=L(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:t.value},{"is-link":a.value},{"is-active":r.value},{"has-active":c.value}]);function V(N){"key"in N&&N.key!=="Enter"||!e.item.link&&m()}function I(){e.item.link&&m()}return(N,ue)=>{const J=ce("VPSidebarItem",!0);return s(),y(re(k.value),{class:H(["VPSidebarItem",B.value])},{default:p(()=>[N.item.text?(s(),l("div",we({key:0,class:"item",role:S.value},Zt(N.item.items?{click:V,keydown:V}:{},!0),{tabindex:N.item.items&&0}),[ji,N.item.link?(s(),y(K,{key:0,tag:$.value,class:"link",href:N.item.link,rel:N.item.rel,target:N.item.target},{default:p(()=>[(s(),y(re(w.value),{class:"text",innerHTML:N.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),y(re(w.value),{key:1,class:"text",innerHTML:N.item.text},null,8,["innerHTML"])),N.item.collapsed!=null?(s(),l("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:I,onKeydown:Xt(I,["enter"]),tabindex:"0"},[_($t,{class:"caret-icon"})],32)):f("",!0)],16,xi)):f("",!0),N.item.items&&N.item.items.length?(s(),l("div",Ui,[N.depth<5?(s(!0),l(A,{key:0},G(N.item.items,F=>(s(),y(J,{key:F.text,item:F,depth:N.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}}),Ri=g(Gi,[["__scopeId","data-v-eb64199c"]]),St=n=>(Z("data-v-7b6857b5"),n=n(),X(),n),qi=St(()=>u("div",{class:"curtain"},null,-1)),Ki={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Wi=St(()=>u("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Yi=b({__name:"VPSidebar",props:{open:{type:Boolean}},setup(n){const{sidebarGroups:e,hasSidebar:t}=ne(),o=n,a=E(null),r=ht(le?document.body:null);return te([o,a],()=>{var c;o.open?(r.value=!0,(c=a.value)==null||c.focus()):r.value=!1},{immediate:!0,flush:"post"}),(c,d)=>i(t)?(s(),l("aside",{key:0,class:H(["VPSidebar",{open:c.open}]),ref_key:"navEl",ref:a,onClick:d[0]||(d[0]=Jt(()=>{},["stop"]))},[qi,u("nav",Ki,[Wi,v(c.$slots,"sidebar-nav-before",{},void 0,!0),(s(!0),l(A,null,G(i(e),m=>(s(),l("div",{key:m.text,class:"group"},[_(Ri,{item:m,depth:0},null,8,["item"])]))),128)),v(c.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}}),Zi=g(Yi,[["__scopeId","data-v-7b6857b5"]]),Xi=b({__name:"VPSkipLink",setup(n){const e=fe(),t=E();te(()=>e.path,()=>t.value.focus());function o({target:a}){const r=document.getElementById(decodeURIComponent(a.hash).slice(1));if(r){const c=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",c)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",c),r.focus(),window.scrollTo(0,0)}}return(a,r)=>(s(),l(A,null,[u("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),u("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}}),Ji=g(Xi,[["__scopeId","data-v-2cc3dcc2"]]),Qi=b({__name:"Layout",setup(n){const{isOpen:e,open:t,close:o}=ne(),a=fe();te(()=>a.path,o),$n(e,o);const{frontmatter:r}=z(),c=Qt(),d=L(()=>!!c["home-hero-image"]);return ft("hero-image-slot-exists",d),(m,k)=>{const $=ce("Content");return i(r).layout!==!1?(s(),l("div",{key:0,class:H(["Layout",i(r).pageClass])},[v(m.$slots,"layout-top",{},void 0,!0),_(Ji),_(sn,{class:"backdrop",show:i(e),onClick:i(o)},null,8,["show","onClick"]),_(Di,null,{"nav-bar-title-before":p(()=>[v(m.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(m.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[v(m.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[v(m.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[v(m.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[v(m.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),_(Ka,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),_(Zi,{open:i(e)},{"sidebar-nav-before":p(()=>[v(m.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[v(m.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),_(ba,null,{"page-top":p(()=>[v(m.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[v(m.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[v(m.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[v(m.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[v(m.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(m.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[v(m.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[v(m.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[v(m.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[v(m.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[v(m.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[v(m.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[v(m.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[v(m.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[v(m.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[v(m.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[v(m.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(m.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(m.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(m.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),_(La),v(m.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),y($,{key:1}))}}}),el=g(Qi,[["__scopeId","data-v-6b5043bc"]]),tl={},nl={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},ol=u("path",{d:"M12,22.2c-0.3,0-0.5-0.1-0.7-0.3l-8.8-8.8c-2.5-2.5-2.5-6.7,0-9.2c2.5-2.5,6.7-2.5,9.2,0L12,4.3l0.4-0.4c0,0,0,0,0,0C13.6,2.7,15.2,2,16.9,2c0,0,0,0,0,0c1.7,0,3.4,0.7,4.6,1.9l0,0c1.2,1.2,1.9,2.9,1.9,4.6c0,1.7-0.7,3.4-1.9,4.6l-8.8,8.8C12.5,22.1,12.3,22.2,12,22.2zM7,4C5.9,4,4.7,4.4,3.9,5.3c-1.8,1.8-1.8,4.6,0,6.4l8.1,8.1l8.1-8.1c0.9-0.9,1.3-2,1.3-3.2c0-1.2-0.5-2.3-1.3-3.2l0,0C19.3,4.5,18.2,4,17,4c0,0,0,0,0,0c-1.2,0-2.3,0.5-3.2,1.3c0,0,0,0,0,0l-1.1,1.1c-0.4,0.4-1,0.4-1.4,0l-1.1-1.1C9.4,4.4,8.2,4,7,4z"},null,-1),al=[ol];function sl(n,e){return s(),l("svg",nl,al)}const rl=g(tl,[["render",sl]]),il={},ll={class:"VPTeamPage"};function cl(n,e){return s(),l("div",ll,[v(n.$slots,"default")])}const oc=g(il,[["render",cl],["__scopeId","data-v-0dac1e67"]]),ul={},dl={class:"VPTeamPageTitle"},ml={key:0,class:"title"},vl={key:1,class:"lead"};function pl(n,e){return s(),l("div",dl,[n.$slots.title?(s(),l("h1",ml,[v(n.$slots,"title",{},void 0,!0)])):f("",!0),n.$slots.lead?(s(),l("p",vl,[v(n.$slots,"lead",{},void 0,!0)])):f("",!0)])}const ac=g(ul,[["render",pl],["__scopeId","data-v-867cfc0f"]]),hl={class:"profile"},fl={class:"avatar"},_l=["src","alt"],gl={class:"data"},bl={class:"name"},kl={key:0,class:"affiliation"},$l={key:0,class:"title"},yl={key:1,class:"at"},wl=["innerHTML"],Ll={key:2,class:"links"},Pl={key:0,class:"sp"},Vl=b({__name:"VPTeamMembersItem",props:{size:{default:"medium"},member:{}},setup(n){return(e,t)=>(s(),l("article",{class:H(["VPTeamMembersItem",[e.size]])},[u("div",hl,[u("figure",fl,[u("img",{class:"avatar-img",src:e.member.avatar,alt:e.member.name},null,8,_l)]),u("div",gl,[u("h1",bl,T(e.member.name),1),e.member.title||e.member.org?(s(),l("p",kl,[e.member.title?(s(),l("span",$l,T(e.member.title),1)):f("",!0),e.member.title&&e.member.org?(s(),l("span",yl," @ ")):f("",!0),e.member.org?(s(),y(K,{key:2,class:H(["org",{link:e.member.orgLink}]),href:e.member.orgLink,"no-icon":""},{default:p(()=>[j(T(e.member.org),1)]),_:1},8,["class","href"])):f("",!0)])):f("",!0),e.member.desc?(s(),l("p",{key:1,class:"desc",innerHTML:e.member.desc},null,8,wl)):f("",!0),e.member.links?(s(),l("div",Ll,[_(Ee,{links:e.member.links},null,8,["links"])])):f("",!0)])]),e.member.sponsor?(s(),l("div",Pl,[_(K,{class:"sp-link",href:e.member.sponsor,"no-icon":""},{default:p(()=>[_(rl,{class:"sp-icon"}),j(" "+T(e.member.actionText||"Sponsor"),1)]),_:1},8,["href"])])):f("",!0)],2))}}),Sl=g(Vl,[["__scopeId","data-v-c8b9bdef"]]),zl={class:"container"},Cl=b({__name:"VPTeamMembers",props:{size:{default:"medium"},members:{}},setup(n){const e=n,t=L(()=>[e.size,`count-${e.members.length}`]);return(o,a)=>(s(),l("div",{class:H(["VPTeamMembers",t.value])},[u("div",zl,[(s(!0),l(A,null,G(o.members,r=>(s(),l("div",{key:r.name,class:"item"},[_(Sl,{size:o.size,member:r},null,8,["size","member"])]))),128))])],2))}}),sc=g(Cl,[["__scopeId","data-v-130c6a1d"]]),st={Layout:el,enhanceApp:({app:n})=>{n.component("Badge",nn)}},Tl=["id","host","repo","repoid","category","categoryid","mapping","term","strict","reactionsenabled","emitmetadata","inputposition","theme","lang","loading"],Ml=b({__name:"Giscus",props:{id:{},host:{},repo:{},repoId:{},category:{},categoryId:{},mapping:{},term:{},theme:{},strict:{},reactionsEnabled:{},emitMetadata:{},inputPosition:{},lang:{},loading:{}},setup(n){const e=E(!1);return Y(()=>{e.value=!0,pt(()=>import("./giscus-aTimukGI.CKTvSCx2.js"),[])}),(t,o)=>e.value?(s(),l("giscus-widget",{key:0,id:t.id,host:t.host,repo:t.repo,repoid:t.repoId,category:t.category,categoryid:t.categoryId,mapping:t.mapping,term:t.term,strict:t.strict,reactionsenabled:t.reactionsEnabled,emitmetadata:t.emitMetadata,inputposition:t.inputPosition,theme:t.theme,lang:t.lang,loading:t.loading},null,8,Tl)):f("",!0)}}),rt=(n,e,t=!0)=>{var k;const o={id:"comment",host:"https://giscus.app",category:"General",mapping:"pathname",term:"Welcome to giscus!",reactionsEnabled:"1",inputPosition:"top",lang:"zh-CN",loading:"lazy",repo:"xxx/xxx",repoId:"",homePageShowComment:!1};if(n.locales){const w=document.querySelector("html").getAttribute("lang");w&&n.locales[w]&&(n.lang=n.locales[w])}const a=n.lightTheme||"light",r=n.darkTheme||"transparent_dark";let c=document.getElementById("giscus");if(c&&c.parentNode.removeChild(c),(e==null?void 0:e.value.comment)!==void 0){if(!(e!=null&&e.value.comment))return}else if(!t)return;if(!n.homePageShowComment&&(!location.pathname||location.pathname==="/"))return;const d=((k=document.querySelector("html"))==null?void 0:k.className.indexOf("dark"))!==-1,m=document.getElementsByClassName("content-container")[0];if(m){const $=document.createElement("div");$.setAttribute("id","giscus"),$.style.height="auto",$.style.marginTop="40px",$.style.borderTop="1px solid var(--vp-c-divider)",$.style.paddingTop="20px",m.append($),en({render:()=>Ve(Ml,{...o,theme:d?r:a,...n})}).mount("#giscus")}},Il=n=>{const e=document.querySelector("html"),t=n.lightTheme||"light",o=n.darkTheme||"transparent_dark";new MutationObserver(r=>{r.forEach(c=>{if(c.type=="attributes"){let d=document.getElementById("comment");d==null||d.setAttribute("theme",e.className.indexOf("dark")!==-1?o:t)}})}).observe(e,{attributeFilter:["class"]})},El=(n,e,t=!0)=>{Y(()=>{rt(n,e.frontmatter,t),Il(n)}),te(()=>e.route.path,()=>We(()=>{rt(n,e.frontmatter,t)}))};/*! medium-zoom 1.1.0 | MIT License | https://github.com/francoischalifour/medium-zoom */var se=Object.assign||function(n){for(var e=1;ei.map(i=>d[i]); +import{d as b,o as s,c as l,r as v,n as H,a as j,t as T,b as y,w as p,e as f,T as ze,_ as g,u as Re,i as jt,f as Ut,g as qe,h as E,j as le,k as L,l as Y,m as u,p as i,q as Z,s as X,v as ie,x as Fe,y as te,z as Ce,A as Ke,B as ut,C as Gt,D as ce,F as A,E as G,G as dt,H as Te,I as _,J as re,K as mt,L as fe,M as we,N as Me,O as Rt,P as xe,Q as qt,R as We,S as vt,U as Kt,V as Wt,W as Yt,X as pt,Y as ht,Z as ft,$ as Zt,a0 as Xt,a1 as Jt,a2 as Qt,a3 as en,a4 as Ve,a5 as tn}from"./framework.CoRJFuj9.js";const nn=b({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(n){return(e,t)=>(s(),l("span",{class:H(["VPBadge",e.type])},[v(e.$slots,"default",{},()=>[j(T(e.text),1)])],2))}}),on={key:0,class:"VPBackdrop"},an=b({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(n){return(e,t)=>(s(),y(ze,{name:"fade"},{default:p(()=>[e.show?(s(),l("div",on)):f("",!0)]),_:1}))}}),sn=g(an,[["__scopeId","data-v-7400d5fd"]]),z=Re;function rn(n,e){let t,o=!1;return()=>{t&&clearTimeout(t),o?t=setTimeout(n,e):(n(),(o=!0)&&setTimeout(()=>o=!1,e))}}function je(n){return/^\//.test(n)?n:`/${n}`}function Ye(n){const{pathname:e,search:t,hash:o,protocol:a}=new URL(n,"http://a.com");if(jt(n)||n.startsWith("#")||!a.startsWith("http")||!Ut(e))return n;const{site:r}=z(),c=e.endsWith("/")||e.endsWith(".html")?n:n.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${t}${o}`);return qe(c)}const Ze=E(le?location.hash:"");le&&window.addEventListener("hashchange",()=>{Ze.value=location.hash});function _e({removeCurrent:n=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:o,page:a,theme:r}=z(),c=L(()=>{var m,k;return{label:(m=t.value.locales[o.value])==null?void 0:m.label,link:((k=t.value.locales[o.value])==null?void 0:k.link)||(o.value==="root"?"/":`/${o.value}/`)}});return{localeLinks:L(()=>Object.entries(t.value.locales).flatMap(([m,k])=>n&&c.value.label===k.label?[]:{text:k.label,link:ln(k.link||(m==="root"?"/":`/${m}/`),r.value.i18nRouting!==!1&&e,a.value.relativePath.slice(c.value.link.length-1),!t.value.cleanUrls)+Ze.value})),currentLang:c}}function ln(n,e,t,o){return e?n.replace(/\/$/,"")+je(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,o?".html":"")):n}const cn=n=>(Z("data-v-922e1a30"),n=n(),X(),n),un={class:"NotFound"},dn={class:"code"},mn={class:"title"},vn=cn(()=>u("div",{class:"divider"},null,-1)),pn={class:"quote"},hn={class:"action"},fn=["href","aria-label"],_n=b({__name:"NotFound",setup(n){const{site:e,theme:t}=z(),{localeLinks:o}=_e({removeCurrent:!1}),a=E("/");return Y(()=>{var c;const r=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");o.value.length&&(a.value=((c=o.value.find(({link:d})=>d.startsWith(r)))==null?void 0:c.link)||o.value[0].link)}),(r,c)=>{var d,m,k,$,w;return s(),l("div",un,[u("p",dn,T(((d=i(t).notFound)==null?void 0:d.code)??"404"),1),u("h1",mn,T(((m=i(t).notFound)==null?void 0:m.title)??"PAGE NOT FOUND"),1),vn,u("blockquote",pn,T(((k=i(t).notFound)==null?void 0:k.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),u("div",hn,[u("a",{class:"link",href:i(qe)(a.value),"aria-label":(($=i(t).notFound)==null?void 0:$.linkLabel)??"go to home"},T(((w=i(t).notFound)==null?void 0:w.linkText)??"Take me home"),9,fn)])])}}}),gn=g(_n,[["__scopeId","data-v-922e1a30"]]);function _t(n,e){if(Array.isArray(n))return Le(n);if(n==null)return[];e=je(e);const t=Object.keys(n).sort((a,r)=>r.split("/").length-a.split("/").length).find(a=>e.startsWith(je(a))),o=t?n[t]:[];return Array.isArray(o)?Le(o):Le(o.items,o.base)}function bn(n){const e=[];let t=0;for(const o in n){const a=n[o];if(a.items){t=e.push(a);continue}e[t]||e.push({items:[]}),e[t].items.push(a)}return e}function kn(n){const e=[];function t(o){for(const a of o)a.text&&a.link&&e.push({text:a.text,link:a.link,docFooterText:a.docFooterText}),a.items&&t(a.items)}return t(n),e}function Ue(n,e){return Array.isArray(e)?e.some(t=>Ue(n,t)):ie(n,e.link)?!0:e.items?Ue(n,e.items):!1}function Le(n,e){return[...n].map(t=>{const o={...t},a=o.base||e;return a&&o.link&&(o.link=a+o.link),o.items&&(o.items=Le(o.items,a)),o})}function ne(){const{frontmatter:n,page:e,theme:t}=z(),o=Fe("(min-width: 960px)"),a=E(!1),r=L(()=>{const I=t.value.sidebar,N=e.value.relativePath;return I?_t(I,N):[]}),c=E(r.value);te(r,(I,N)=>{JSON.stringify(I)!==JSON.stringify(N)&&(c.value=r.value)});const d=L(()=>n.value.sidebar!==!1&&c.value.length>0&&n.value.layout!=="home"),m=L(()=>k?n.value.aside==null?t.value.aside==="left":n.value.aside==="left":!1),k=L(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:t.value.aside!==!1),$=L(()=>d.value&&o.value),w=L(()=>d.value?bn(c.value):[]);function S(){a.value=!0}function B(){a.value=!1}function V(){a.value?B():S()}return{isOpen:a,sidebar:c,sidebarGroups:w,hasSidebar:d,hasAside:k,leftAside:m,isSidebarEnabled:$,open:S,close:B,toggle:V}}function $n(n,e){let t;Ce(()=>{t=n.value?document.activeElement:void 0}),Y(()=>{window.addEventListener("keyup",o)}),Ke(()=>{window.removeEventListener("keyup",o)});function o(a){a.key==="Escape"&&n.value&&(e(),t==null||t.focus())}}function yn(n){const{page:e}=z(),t=E(!1),o=L(()=>n.value.collapsed!=null),a=L(()=>!!n.value.link),r=E(!1),c=()=>{r.value=ie(e.value.relativePath,n.value.link)};te([e,n,Ze],c),Y(c);const d=L(()=>r.value?!0:n.value.items?Ue(e.value.relativePath,n.value.items):!1),m=L(()=>!!(n.value.items&&n.value.items.length));Ce(()=>{t.value=!!(o.value&&n.value.collapsed)}),ut(()=>{(r.value||d.value)&&(t.value=!1)});function k(){o.value&&(t.value=!t.value)}return{collapsed:t,collapsible:o,isLink:a,isActiveLink:r,hasActiveLink:d,hasChildren:m,toggle:k}}function wn(){const{hasSidebar:n}=ne(),e=Fe("(min-width: 960px)"),t=Fe("(min-width: 1280px)");return{isAsideEnabled:L(()=>!t.value&&!e.value?!1:n.value?t.value:e.value)}}const Ge=[];function gt(n){return typeof n.outline=="object"&&!Array.isArray(n.outline)&&n.outline.label||n.outlineTitle||"On this page"}function Xe(n){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const o=Number(t.tagName[1]);return{element:t,title:Ln(t),link:"#"+t.id,level:o}});return Pn(e,n)}function Ln(n){let e="";for(const t of n.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function Pn(n,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,a]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;n=n.filter(c=>c.level>=o&&c.level<=a),Ge.length=0;for(const{element:c,link:d}of n)Ge.push({element:c,link:d});const r=[];e:for(let c=0;c=0;m--){const k=n[m];if(k.level{requestAnimationFrame(r),window.addEventListener("scroll",o)}),Gt(()=>{c(location.hash)}),Ke(()=>{window.removeEventListener("scroll",o)});function r(){if(!t.value)return;const d=(()=>{var I;const V=(I=document.querySelector("#VPContent .VPDoc"))==null?void 0:I.firstElementChild;return V?ot(V):78})(),m=window.scrollY,k=window.innerHeight,$=document.body.offsetHeight,w=Math.abs(m+k-$)<1,S=Ge.map(({element:V,link:I})=>({link:I,top:ot(V)})).filter(({top:V})=>!Number.isNaN(V)).sort((V,I)=>V.top-I.top);if(!S.length){c(null);return}if(m<1){c(null);return}if(w){c(S[S.length-1].link);return}let B=null;for(const{link:V,top:I}of S){if(I>m+d)break;B=V}c(B)}function c(d){a&&a.classList.remove("active"),d==null?a=null:a=n.value.querySelector(`a[href="${decodeURIComponent(d)}"]`);const m=a;m?(m.classList.add("active"),e.value.style.top=m.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function ot(n){let e=0;for(;n!==document.body;){if(n===null)return NaN;e+=n.offsetTop,n=n.offsetParent}return e}const Sn=["href","title"],zn=b({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(n){function e({target:t}){const o=t.href.split("#")[1],a=document.getElementById(decodeURIComponent(o));a==null||a.focus({preventScroll:!0})}return(t,o)=>{const a=ce("VPDocOutlineItem",!0);return s(),l("ul",{class:H(["VPDocOutlineItem",t.root?"root":"nested"])},[(s(!0),l(A,null,G(t.headers,({children:r,link:c,title:d})=>(s(),l("li",null,[u("a",{class:"outline-link",href:c,onClick:e,title:d},T(d),9,Sn),r!=null&&r.length?(s(),y(a,{key:0,headers:r},null,8,["headers"])):f("",!0)]))),256))],2)}}}),bt=g(zn,[["__scopeId","data-v-cf5865db"]]),Cn=n=>(Z("data-v-e2c17725"),n=n(),X(),n),Tn={class:"content"},Mn={class:"outline-title",role:"heading","aria-level":"2"},In={"aria-labelledby":"doc-outline-aria-label"},En=Cn(()=>u("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Nn=b({__name:"VPDocAsideOutline",setup(n){const{frontmatter:e,theme:t}=z(),o=dt([]);Te(()=>{o.value=Xe(e.value.outline??t.value.outline)});const a=E(),r=E();return Vn(a,r),(c,d)=>(s(),l("div",{class:H(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:a,role:"navigation"},[u("div",Tn,[u("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),u("div",Mn,T(i(gt)(i(t))),1),u("nav",In,[En,_(bt,{headers:o.value,root:!0},null,8,["headers"])])])],2))}}),Hn=g(Nn,[["__scopeId","data-v-e2c17725"]]),An={class:"VPDocAsideCarbonAds"},Bn=b({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(n){const e=()=>null;return(t,o)=>(s(),l("div",An,[_(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),On=n=>(Z("data-v-8b9c5d2d"),n=n(),X(),n),Dn={class:"VPDocAside"},Fn=On(()=>u("div",{class:"spacer"},null,-1)),xn=b({__name:"VPDocAside",setup(n){const{theme:e}=z();return(t,o)=>(s(),l("div",Dn,[v(t.$slots,"aside-top",{},void 0,!0),v(t.$slots,"aside-outline-before",{},void 0,!0),_(Hn),v(t.$slots,"aside-outline-after",{},void 0,!0),Fn,v(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(s(),y(Bn,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):f("",!0),v(t.$slots,"aside-ads-after",{},void 0,!0),v(t.$slots,"aside-bottom",{},void 0,!0)]))}}),jn=g(xn,[["__scopeId","data-v-8b9c5d2d"]]);function Un(){const{theme:n,page:e}=z();return L(()=>{const{text:t="Edit this page",pattern:o=""}=n.value.editLink||{};let a;return typeof o=="function"?a=o(e.value):a=o.replace(/:path/g,e.value.filePath),{url:a,text:t}})}function Gn(){const{page:n,theme:e,frontmatter:t}=z();return L(()=>{var m,k,$,w,S,B,V,I;const o=_t(e.value.sidebar,n.value.relativePath),a=kn(o),r=a.findIndex(N=>ie(n.value.relativePath,N.link)),c=((m=e.value.docFooter)==null?void 0:m.prev)===!1&&!t.value.prev||t.value.prev===!1,d=((k=e.value.docFooter)==null?void 0:k.next)===!1&&!t.value.next||t.value.next===!1;return{prev:c?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??(($=a[r-1])==null?void 0:$.docFooterText)??((w=a[r-1])==null?void 0:w.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((S=a[r-1])==null?void 0:S.link)},next:d?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((B=a[r+1])==null?void 0:B.docFooterText)??((V=a[r+1])==null?void 0:V.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((I=a[r+1])==null?void 0:I.link)}}})}const Rn={},qn={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Kn=u("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Wn=u("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Yn=[Kn,Wn];function Zn(n,e){return s(),l("svg",qn,Yn)}const Xn=g(Rn,[["render",Zn]]),K=b({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(n){const e=n,t=L(()=>e.tag??(e.href?"a":"span")),o=L(()=>e.href&&mt.test(e.href));return(a,r)=>(s(),y(re(t.value),{class:H(["VPLink",{link:a.href,"vp-external-link-icon":o.value,"no-icon":a.noIcon}]),href:a.href?i(Ye)(a.href):void 0,target:a.target??(o.value?"_blank":void 0),rel:a.rel??(o.value?"noreferrer":void 0)},{default:p(()=>[v(a.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Jn={class:"VPLastUpdated"},Qn=["datetime"],eo=b({__name:"VPDocFooterLastUpdated",setup(n){const{theme:e,page:t,frontmatter:o,lang:a}=z(),r=L(()=>new Date(o.value.lastUpdated??t.value.lastUpdated)),c=L(()=>r.value.toISOString()),d=E("");return Y(()=>{Ce(()=>{var m,k,$;d.value=new Intl.DateTimeFormat((k=(m=e.value.lastUpdated)==null?void 0:m.formatOptions)!=null&&k.forceLocale?a.value:void 0,(($=e.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(r.value)})}),(m,k)=>{var $;return s(),l("p",Jn,[j(T((($=i(e).lastUpdated)==null?void 0:$.text)||i(e).lastUpdatedText||"Last updated")+": ",1),u("time",{datetime:c.value},T(d.value),9,Qn)])}}}),to=g(eo,[["__scopeId","data-v-42f5af39"]]),no={key:0,class:"VPDocFooter"},oo={key:0,class:"edit-info"},ao={key:0,class:"edit-link"},so={key:1,class:"last-updated"},ro={key:1,class:"prev-next"},io={class:"pager"},lo=["innerHTML"],co=["innerHTML"],uo={class:"pager"},mo=["innerHTML"],vo=["innerHTML"],po=b({__name:"VPDocFooter",setup(n){const{theme:e,page:t,frontmatter:o}=z(),a=Un(),r=Gn(),c=L(()=>e.value.editLink&&o.value.editLink!==!1),d=L(()=>t.value.lastUpdated&&o.value.lastUpdated!==!1),m=L(()=>c.value||d.value||r.value.prev||r.value.next);return(k,$)=>{var w,S,B,V;return m.value?(s(),l("footer",no,[v(k.$slots,"doc-footer-before",{},void 0,!0),c.value||d.value?(s(),l("div",oo,[c.value?(s(),l("div",ao,[_(K,{class:"edit-link-button",href:i(a).url,"no-icon":!0},{default:p(()=>[_(Xn,{class:"edit-link-icon","aria-label":"edit icon"}),j(" "+T(i(a).text),1)]),_:1},8,["href"])])):f("",!0),d.value?(s(),l("div",so,[_(to)])):f("",!0)])):f("",!0),(w=i(r).prev)!=null&&w.link||(S=i(r).next)!=null&&S.link?(s(),l("nav",ro,[u("div",io,[(B=i(r).prev)!=null&&B.link?(s(),y(K,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:p(()=>{var I;return[u("span",{class:"desc",innerHTML:((I=i(e).docFooter)==null?void 0:I.prev)||"Previous page"},null,8,lo),u("span",{class:"title",innerHTML:i(r).prev.text},null,8,co)]}),_:1},8,["href"])):f("",!0)]),u("div",uo,[(V=i(r).next)!=null&&V.link?(s(),y(K,{key:0,class:"pager-link next",href:i(r).next.link},{default:p(()=>{var I;return[u("span",{class:"desc",innerHTML:((I=i(e).docFooter)==null?void 0:I.next)||"Next page"},null,8,mo),u("span",{class:"title",innerHTML:i(r).next.text},null,8,vo)]}),_:1},8,["href"])):f("",!0)])])):f("",!0)])):f("",!0)}}}),ho=g(po,[["__scopeId","data-v-c6c7078a"]]),fo=n=>(Z("data-v-c1252fdc"),n=n(),X(),n),_o={class:"container"},go=fo(()=>u("div",{class:"aside-curtain"},null,-1)),bo={class:"aside-container"},ko={class:"aside-content"},$o={class:"content"},yo={class:"content-container"},wo={class:"main"},Lo=b({__name:"VPDoc",setup(n){const{theme:e}=z(),t=fe(),{hasSidebar:o,hasAside:a,leftAside:r}=ne(),c=L(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(d,m)=>{const k=ce("Content");return s(),l("div",{class:H(["VPDoc",{"has-sidebar":i(o),"has-aside":i(a)}])},[v(d.$slots,"doc-top",{},void 0,!0),u("div",_o,[i(a)?(s(),l("div",{key:0,class:H(["aside",{"left-aside":i(r)}])},[go,u("div",bo,[u("div",ko,[_(jn,null,{"aside-top":p(()=>[v(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[v(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[v(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),u("div",$o,[u("div",yo,[v(d.$slots,"doc-before",{},void 0,!0),u("main",wo,[_(k,{class:H(["vp-doc",[c.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),_(ho,null,{"doc-footer-before":p(()=>[v(d.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),v(d.$slots,"doc-after",{},void 0,!0)])])]),v(d.$slots,"doc-bottom",{},void 0,!0)],2)}}}),Po=g(Lo,[["__scopeId","data-v-c1252fdc"]]),Vo=b({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(n){const e=n,t=L(()=>e.href&&mt.test(e.href)),o=L(()=>e.tag||e.href?"a":"button");return(a,r)=>(s(),y(re(o.value),{class:H(["VPButton",[a.size,a.theme]]),href:a.href?i(Ye)(a.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:p(()=>[j(T(a.text),1)]),_:1},8,["class","href","target","rel"]))}}),So=g(Vo,[["__scopeId","data-v-5a0572b2"]]),zo=["src","alt"],Co=b({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(n){return(e,t)=>{const o=ce("VPImage",!0);return e.image?(s(),l(A,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),l("img",we({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(qe)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,zo)):(s(),l(A,{key:1},[_(o,we({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),_(o,we({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}}),Se=g(Co,[["__scopeId","data-v-52554789"]]),To=n=>(Z("data-v-27e36ebe"),n=n(),X(),n),Mo={class:"container"},Io={class:"main"},Eo={key:0,class:"name"},No=["innerHTML"],Ho=["innerHTML"],Ao=["innerHTML"],Bo={key:0,class:"actions"},Oo={key:0,class:"image"},Do={class:"image-container"},Fo=To(()=>u("div",{class:"image-bg"},null,-1)),xo=b({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(n){const e=Me("hero-image-slot-exists");return(t,o)=>(s(),l("div",{class:H(["VPHero",{"has-image":t.image||i(e)}])},[u("div",Mo,[u("div",Io,[v(t.$slots,"home-hero-info",{},()=>[t.name?(s(),l("h1",Eo,[u("span",{innerHTML:t.name,class:"clip"},null,8,No)])):f("",!0),t.text?(s(),l("p",{key:1,innerHTML:t.text,class:"text"},null,8,Ho)):f("",!0),t.tagline?(s(),l("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Ao)):f("",!0)],!0),t.actions?(s(),l("div",Bo,[(s(!0),l(A,null,G(t.actions,a=>(s(),l("div",{key:a.link,class:"action"},[_(So,{tag:"a",size:"medium",theme:a.theme,text:a.text,href:a.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||i(e)?(s(),l("div",Oo,[u("div",Do,[Fo,v(t.$slots,"home-hero-image",{},()=>[t.image?(s(),y(Se,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}}),jo=g(xo,[["__scopeId","data-v-27e36ebe"]]),Uo=b({__name:"VPHomeHero",setup(n){const{frontmatter:e}=z();return(t,o)=>i(e).hero?(s(),y(jo,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info":p(()=>[v(t.$slots,"home-hero-info")]),"home-hero-image":p(()=>[v(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Go={},Ro={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},qo=u("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),Ko=[qo];function Wo(n,e){return s(),l("svg",Ro,Ko)}const Yo=g(Go,[["render",Wo]]),Zo={class:"box"},Xo={key:0,class:"icon"},Jo=["innerHTML"],Qo=["innerHTML"],ea=["innerHTML"],ta={key:4,class:"link-text"},na={class:"link-text-value"},oa=b({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(n){return(e,t)=>(s(),y(K,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:p(()=>[u("article",Zo,[typeof e.icon=="object"&&e.icon.wrap?(s(),l("div",Xo,[_(Se,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),y(Se,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),l("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Jo)):f("",!0),u("h2",{class:"title",innerHTML:e.title},null,8,Qo),e.details?(s(),l("p",{key:3,class:"details",innerHTML:e.details},null,8,ea)):f("",!0),e.linkText?(s(),l("div",ta,[u("p",na,[j(T(e.linkText)+" ",1),_(Yo,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),aa=g(oa,[["__scopeId","data-v-790a0f07"]]),sa={key:0,class:"VPFeatures"},ra={class:"container"},ia={class:"items"},la=b({__name:"VPFeatures",props:{features:{}},setup(n){const e=n,t=L(()=>{const o=e.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o>3)return"grid-4"}else return});return(o,a)=>o.features?(s(),l("div",sa,[u("div",ra,[u("div",ia,[(s(!0),l(A,null,G(o.features,r=>(s(),l("div",{key:r.title,class:H(["item",[t.value]])},[_(aa,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}}),ca=g(la,[["__scopeId","data-v-8c75346a"]]),ua=b({__name:"VPHomeFeatures",setup(n){const{frontmatter:e}=z();return(t,o)=>i(e).features?(s(),y(ca,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):f("",!0)}}),da={class:"VPHome"},ma=b({__name:"VPHome",setup(n){return(e,t)=>{const o=ce("Content");return s(),l("div",da,[v(e.$slots,"home-hero-before",{},void 0,!0),_(Uo,null,{"home-hero-info":p(()=>[v(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),v(e.$slots,"home-hero-after",{},void 0,!0),v(e.$slots,"home-features-before",{},void 0,!0),_(ua),v(e.$slots,"home-features-after",{},void 0,!0),_(o)])}}}),va=g(ma,[["__scopeId","data-v-f308d76d"]]),pa={},ha={class:"VPPage"};function fa(n,e){const t=ce("Content");return s(),l("div",ha,[v(n.$slots,"page-top"),_(t),v(n.$slots,"page-bottom")])}const _a=g(pa,[["render",fa]]),ga=b({__name:"VPContent",setup(n){const{page:e,frontmatter:t}=z(),{hasSidebar:o}=ne();return(a,r)=>(s(),l("div",{class:H(["VPContent",{"has-sidebar":i(o),"is-home":i(t).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?v(a.$slots,"not-found",{key:0},()=>[_(gn)],!0):i(t).layout==="page"?(s(),y(_a,{key:1},{"page-top":p(()=>[v(a.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[v(a.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(s(),y(va,{key:2},{"home-hero-before":p(()=>[v(a.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[v(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(a.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[v(a.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[v(a.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[v(a.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(s(),y(re(i(t).layout),{key:3})):(s(),y(Po,{key:4},{"doc-top":p(()=>[v(a.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[v(a.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[v(a.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[v(a.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[v(a.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[v(a.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[v(a.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(a.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(a.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(a.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[v(a.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),ba=g(ga,[["__scopeId","data-v-d9b0d414"]]),ka={class:"container"},$a=["innerHTML"],ya=["innerHTML"],wa=b({__name:"VPFooter",setup(n){const{theme:e,frontmatter:t}=z(),{hasSidebar:o}=ne();return(a,r)=>i(e).footer&&i(t).footer!==!1?(s(),l("footer",{key:0,class:H(["VPFooter",{"has-sidebar":i(o)}])},[u("div",ka,[i(e).footer.message?(s(),l("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,$a)):f("",!0),i(e).footer.copyright?(s(),l("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,ya)):f("",!0)])],2)):f("",!0)}}),La=g(wa,[["__scopeId","data-v-83c9c484"]]);function kt(){const{theme:n,frontmatter:e}=z(),t=dt([]),o=L(()=>t.value.length>0);return Te(()=>{t.value=Xe(e.value.outline??n.value.outline)}),{headers:t,hasLocalNav:o}}const Pa={},Va={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Sa=u("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),za=[Sa];function Ca(n,e){return s(),l("svg",Va,za)}const $t=g(Pa,[["render",Ca]]),Ta={class:"header"},Ma={class:"outline"},Ia=b({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(n){const e=n,{theme:t}=z(),o=E(!1),a=E(0),r=E(),c=E();Rt(r,()=>{o.value=!1}),xe("Escape",()=>{o.value=!1}),Te(()=>{o.value=!1});function d(){o.value=!o.value,a.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function m($){$.target.classList.contains("outline-link")&&(c.value&&(c.value.style.transition="none"),We(()=>{o.value=!1}))}function k(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return($,w)=>(s(),l("div",{class:"VPLocalNavOutlineDropdown",style:qt({"--vp-vh":a.value+"px"}),ref_key:"main",ref:r},[$.headers.length>0?(s(),l("button",{key:0,onClick:d,class:H({open:o.value})},[j(T(i(gt)(i(t)))+" ",1),_($t,{class:"icon"})],2)):(s(),l("button",{key:1,onClick:k},T(i(t).returnToTopLabel||"Return to top"),1)),_(ze,{name:"flyout"},{default:p(()=>[o.value?(s(),l("div",{key:0,ref_key:"items",ref:c,class:"items",onClick:m},[u("div",Ta,[u("a",{class:"top-link",href:"#",onClick:k},T(i(t).returnToTopLabel||"Return to top"),1)]),u("div",Ma,[_(bt,{headers:$.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}}),Ea=g(Ia,[["__scopeId","data-v-2d2d5d54"]]),Na={},Ha={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Aa=u("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Ba=u("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Oa=u("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Da=u("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),Fa=[Aa,Ba,Oa,Da];function xa(n,e){return s(),l("svg",Ha,Fa)}const ja=g(Na,[["render",xa]]),Ua={class:"container"},Ga=["aria-expanded"],Ra={class:"menu-text"},qa=b({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(n){const{theme:e,frontmatter:t}=z(),{hasSidebar:o}=ne(),{headers:a}=kt(),{y:r}=vt(),c=E(0);Y(()=>{c.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Te(()=>{a.value=Xe(t.value.outline??e.value.outline)});const d=L(()=>a.value.length===0),m=L(()=>d.value&&!o.value),k=L(()=>({VPLocalNav:!0,"has-sidebar":o.value,empty:d.value,fixed:m.value}));return($,w)=>i(t).layout!=="home"&&(!m.value||i(r)>=c.value)?(s(),l("div",{key:0,class:H(k.value)},[u("div",Ua,[i(o)?(s(),l("button",{key:0,class:"menu","aria-expanded":$.open,"aria-controls":"VPSidebarNav",onClick:w[0]||(w[0]=S=>$.$emit("open-menu"))},[_(ja,{class:"menu-icon"}),u("span",Ra,T(i(e).sidebarMenuLabel||"Menu"),1)],8,Ga)):f("",!0),_(Ea,{headers:i(a),navHeight:c.value},null,8,["headers","navHeight"])])],2)):f("",!0)}}),Ka=g(qa,[["__scopeId","data-v-2158a76a"]]);function Wa(){const n=E(!1);function e(){n.value=!0,window.addEventListener("resize",a)}function t(){n.value=!1,window.removeEventListener("resize",a)}function o(){n.value?t():e()}function a(){window.outerWidth>=768&&t()}const r=fe();return te(()=>r.path,t),{isScreenOpen:n,openScreen:e,closeScreen:t,toggleScreen:o}}const Ya={},Za={class:"VPSwitch",type:"button",role:"switch"},Xa={class:"check"},Ja={key:0,class:"icon"};function Qa(n,e){return s(),l("button",Za,[u("span",Xa,[n.$slots.default?(s(),l("span",Ja,[v(n.$slots,"default",{},void 0,!0)])):f("",!0)])])}const es=g(Ya,[["render",Qa],["__scopeId","data-v-79d0ed95"]]),ts={},ns={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},os=u("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),as=[os];function ss(n,e){return s(),l("svg",ns,as)}const rs=g(ts,[["render",ss]]),is={},ls={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},cs=Kt('',9),us=[cs];function ds(n,e){return s(),l("svg",ls,us)}const ms=g(is,[["render",ds]]),vs=b({__name:"VPSwitchAppearance",setup(n){const{isDark:e,theme:t}=z(),o=Me("toggle-appearance",()=>{e.value=!e.value}),a=L(()=>e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme");return(r,c)=>(s(),y(es,{title:a.value,class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(o)},{default:p(()=>[_(ms,{class:"sun"}),_(rs,{class:"moon"})]),_:1},8,["title","aria-checked","onClick"]))}}),Je=g(vs,[["__scopeId","data-v-0298adb0"]]),ps={key:0,class:"VPNavBarAppearance"},hs=b({__name:"VPNavBarAppearance",setup(n){const{site:e}=z();return(t,o)=>i(e).appearance&&i(e).appearance!=="force-dark"?(s(),l("div",ps,[_(Je)])):f("",!0)}}),fs=g(hs,[["__scopeId","data-v-0e934124"]]),Qe=E();let yt=!1,Oe=0;function _s(n){const e=E(!1);if(le){!yt&&gs(),Oe++;const t=te(Qe,o=>{var a,r,c;o===n.el.value||(a=n.el.value)!=null&&a.contains(o)?(e.value=!0,(r=n.onFocus)==null||r.call(n)):(e.value=!1,(c=n.onBlur)==null||c.call(n))});Ke(()=>{t(),Oe--,Oe||bs()})}return Wt(e)}function gs(){document.addEventListener("focusin",wt),yt=!0,Qe.value=document.activeElement}function bs(){document.removeEventListener("focusin",wt)}function wt(){Qe.value=document.activeElement}const ks={},$s={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ys=u("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),ws=[ys];function Ls(n,e){return s(),l("svg",$s,ws)}const Lt=g(ks,[["render",Ls]]),Ps={},Vs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ss=u("circle",{cx:"12",cy:"12",r:"2"},null,-1),zs=u("circle",{cx:"19",cy:"12",r:"2"},null,-1),Cs=u("circle",{cx:"5",cy:"12",r:"2"},null,-1),Ts=[Ss,zs,Cs];function Ms(n,e){return s(),l("svg",Vs,Ts)}const Is=g(Ps,[["render",Ms]]),Es={class:"VPMenuLink"},Ns=b({__name:"VPMenuLink",props:{item:{}},setup(n){const{page:e}=z();return(t,o)=>(s(),l("div",Es,[_(K,{class:H({active:i(ie)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:p(()=>[j(T(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),Ie=g(Ns,[["__scopeId","data-v-9d1535a1"]]),Hs={class:"VPMenuGroup"},As={key:0,class:"title"},Bs=b({__name:"VPMenuGroup",props:{text:{},items:{}},setup(n){return(e,t)=>(s(),l("div",Hs,[e.text?(s(),l("p",As,T(e.text),1)):f("",!0),(s(!0),l(A,null,G(e.items,o=>(s(),l(A,null,["link"in o?(s(),y(Ie,{key:0,item:o},null,8,["item"])):f("",!0)],64))),256))]))}}),Os=g(Bs,[["__scopeId","data-v-c1904112"]]),Ds={class:"VPMenu"},Fs={key:0,class:"items"},xs=b({__name:"VPMenu",props:{items:{}},setup(n){return(e,t)=>(s(),l("div",Ds,[e.items?(s(),l("div",Fs,[(s(!0),l(A,null,G(e.items,o=>(s(),l(A,{key:o.text},["link"in o?(s(),y(Ie,{key:0,item:o},null,8,["item"])):(s(),y(Os,{key:1,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0),v(e.$slots,"default",{},void 0,!0)]))}}),js=g(xs,[["__scopeId","data-v-e699aa0c"]]),Us=["aria-expanded","aria-label"],Gs={key:0,class:"text"},Rs=["innerHTML"],qs={class:"menu"},Ks=b({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(n){const e=E(!1),t=E();_s({el:t,onBlur:o});function o(){e.value=!1}return(a,r)=>(s(),l("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:r[1]||(r[1]=c=>e.value=!0),onMouseleave:r[2]||(r[2]=c=>e.value=!1)},[u("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":a.label,onClick:r[0]||(r[0]=c=>e.value=!e.value)},[a.button||a.icon?(s(),l("span",Gs,[a.icon?(s(),y(re(a.icon),{key:0,class:"option-icon"})):f("",!0),a.button?(s(),l("span",{key:1,innerHTML:a.button},null,8,Rs)):f("",!0),_(Lt,{class:"text-icon"})])):(s(),y(Is,{key:1,class:"icon"}))],8,Us),u("div",qs,[_(js,{items:a.items},{default:p(()=>[v(a.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),et=g(Ks,[["__scopeId","data-v-eaf183b7"]]),Ws={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Ys=["href","aria-label","innerHTML"],Zs=b({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(n){const e=n,t=L(()=>typeof e.icon=="object"?e.icon.svg:Ws[e.icon]);return(o,a)=>(s(),l("a",{class:"VPSocialLink no-icon",href:o.link,"aria-label":o.ariaLabel??(typeof o.icon=="string"?o.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Ys))}}),Xs=g(Zs,[["__scopeId","data-v-f4d58015"]]),Js={class:"VPSocialLinks"},Qs=b({__name:"VPSocialLinks",props:{links:{}},setup(n){return(e,t)=>(s(),l("div",Js,[(s(!0),l(A,null,G(e.links,({link:o,icon:a,ariaLabel:r})=>(s(),y(Xs,{key:o,icon:a,link:o,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),Ee=g(Qs,[["__scopeId","data-v-20ea2c3a"]]),er={key:0,class:"group translations"},tr={class:"trans-title"},nr={key:1,class:"group"},or={class:"item appearance"},ar={class:"label"},sr={class:"appearance-action"},rr={key:2,class:"group"},ir={class:"item social-links"},lr=b({__name:"VPNavBarExtra",setup(n){const{site:e,theme:t}=z(),{localeLinks:o,currentLang:a}=_e({correspondingLink:!0}),r=L(()=>o.value.length&&a.value.label||e.value.appearance||t.value.socialLinks);return(c,d)=>r.value?(s(),y(et,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[i(o).length&&i(a).label?(s(),l("div",er,[u("p",tr,T(i(a).label),1),(s(!0),l(A,null,G(i(o),m=>(s(),y(Ie,{key:m.link,item:m},null,8,["item"]))),128))])):f("",!0),i(e).appearance&&i(e).appearance!=="force-dark"?(s(),l("div",nr,[u("div",or,[u("p",ar,T(i(t).darkModeSwitchLabel||"Appearance"),1),u("div",sr,[_(Je)])])])):f("",!0),i(t).socialLinks?(s(),l("div",rr,[u("div",ir,[_(Ee,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}}),cr=g(lr,[["__scopeId","data-v-a4952b56"]]),ur=n=>(Z("data-v-5df5a4ba"),n=n(),X(),n),dr=["aria-expanded"],mr=ur(()=>u("span",{class:"container"},[u("span",{class:"top"}),u("span",{class:"middle"}),u("span",{class:"bottom"})],-1)),vr=[mr],pr=b({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(n){return(e,t)=>(s(),l("button",{type:"button",class:H(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=o=>e.$emit("click"))},vr,10,dr))}}),hr=g(pr,[["__scopeId","data-v-5df5a4ba"]]),fr=["innerHTML"],_r=b({__name:"VPNavBarMenuLink",props:{item:{}},setup(n){const{page:e}=z();return(t,o)=>(s(),y(K,{class:H({VPNavBarMenuLink:!0,active:i(ie)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:p(()=>[u("span",{innerHTML:t.item.text},null,8,fr)]),_:1},8,["class","href","target","rel"]))}}),gr=g(_r,[["__scopeId","data-v-01a9a2a9"]]),br=b({__name:"VPNavBarMenuGroup",props:{item:{}},setup(n){const e=n,{page:t}=z(),o=r=>"link"in r?ie(t.value.relativePath,r.link,!!e.item.activeMatch):r.items.some(o),a=L(()=>o(e.item));return(r,c)=>(s(),y(et,{class:H({VPNavBarMenuGroup:!0,active:i(ie)(i(t).relativePath,r.item.activeMatch,!!r.item.activeMatch)||a.value}),button:r.item.text,items:r.item.items},null,8,["class","button","items"]))}}),kr=n=>(Z("data-v-10e7ffc9"),n=n(),X(),n),$r={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},yr=kr(()=>u("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),wr=b({__name:"VPNavBarMenu",setup(n){const{theme:e}=z();return(t,o)=>i(e).nav?(s(),l("nav",$r,[yr,(s(!0),l(A,null,G(i(e).nav,a=>(s(),l(A,{key:a.text},["link"in a?(s(),y(gr,{key:0,item:a},null,8,["item"])):(s(),y(br,{key:1,item:a},null,8,["item"]))],64))),128))])):f("",!0)}}),Lr=g(wr,[["__scopeId","data-v-10e7ffc9"]]);function Pr(n){const{localeIndex:e,theme:t}=z();function o(a){var V,I,N;const r=a.split("."),c=(V=t.value.search)==null?void 0:V.options,d=c&&typeof c=="object",m=d&&((N=(I=c.locales)==null?void 0:I[e.value])==null?void 0:N.translations)||null,k=d&&c.translations||null;let $=m,w=k,S=n;const B=r.pop();for(const ue of r){let J=null;const F=S==null?void 0:S[ue];F&&(J=S=F);const oe=w==null?void 0:w[ue];oe&&(J=w=oe);const Q=$==null?void 0:$[ue];Q&&(J=$=Q),F||(S=J),oe||(w=J),Q||($=J)}return($==null?void 0:$[B])??(w==null?void 0:w[B])??(S==null?void 0:S[B])??""}return o}const Vr=["aria-label"],Sr={class:"DocSearch-Button-Container"},zr=u("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[u("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Cr={class:"DocSearch-Button-Placeholder"},Tr=u("span",{class:"DocSearch-Button-Keys"},[u("kbd",{class:"DocSearch-Button-Key"}),u("kbd",{class:"DocSearch-Button-Key"},"K")],-1),at=b({__name:"VPNavBarSearchButton",setup(n){const t=Pr({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(o,a)=>(s(),l("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(t)("button.buttonAriaLabel")},[u("span",Sr,[zr,u("span",Cr,T(i(t)("button.buttonText")),1)]),Tr],8,Vr))}}),Mr={class:"VPNavBarSearch"},Ir={id:"local-search"},Er={key:1,id:"docsearch"},Nr=b({__name:"VPNavBarSearch",setup(n){const e=Yt(()=>pt(()=>import("./VPLocalSearchBox.uXxUzkwX.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:o}=z(),a=E(!1),r=E(!1);Y(()=>{});function c(){a.value||(a.value=!0,setTimeout(d,16))}function d(){const w=new Event("keydown");w.key="k",w.metaKey=!0,window.dispatchEvent(w),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||d()},16)}function m(w){const S=w.target,B=S.tagName;return S.isContentEditable||B==="INPUT"||B==="SELECT"||B==="TEXTAREA"}const k=E(!1);xe("k",w=>{(w.ctrlKey||w.metaKey)&&(w.preventDefault(),k.value=!0)}),xe("/",w=>{m(w)||(w.preventDefault(),k.value=!0)});const $="local";return(w,S)=>{var B;return s(),l("div",Mr,[i($)==="local"?(s(),l(A,{key:0},[k.value?(s(),y(i(e),{key:0,onClose:S[0]||(S[0]=V=>k.value=!1)})):f("",!0),u("div",Ir,[_(at,{onClick:S[1]||(S[1]=V=>k.value=!0)})])],64)):i($)==="algolia"?(s(),l(A,{key:1},[a.value?(s(),y(i(t),{key:0,algolia:((B=i(o).search)==null?void 0:B.options)??i(o).algolia,onVnodeBeforeMount:S[2]||(S[2]=V=>r.value=!0)},null,8,["algolia"])):f("",!0),r.value?f("",!0):(s(),l("div",Er,[_(at,{onClick:c})]))],64)):f("",!0)])}}}),Hr=b({__name:"VPNavBarSocialLinks",setup(n){const{theme:e}=z();return(t,o)=>i(e).socialLinks?(s(),y(Ee,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):f("",!0)}}),Ar=g(Hr,[["__scopeId","data-v-17479deb"]]),Br=["href","rel","target"],Or=b({__name:"VPNavBarTitle",setup(n){const{site:e,theme:t}=z(),{hasSidebar:o}=ne(),{currentLang:a}=_e(),r=L(()=>{var m;return typeof t.value.logoLink=="string"?t.value.logoLink:(m=t.value.logoLink)==null?void 0:m.link}),c=L(()=>{var m;return typeof t.value.logoLink=="string"||(m=t.value.logoLink)==null?void 0:m.rel}),d=L(()=>{var m;return typeof t.value.logoLink=="string"||(m=t.value.logoLink)==null?void 0:m.target});return(m,k)=>(s(),l("div",{class:H(["VPNavBarTitle",{"has-sidebar":i(o)}])},[u("a",{class:"title",href:r.value??i(Ye)(i(a).link),rel:c.value,target:d.value},[v(m.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(s(),y(Se,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):f("",!0),i(t).siteTitle?(s(),l(A,{key:1},[j(T(i(t).siteTitle),1)],64)):i(t).siteTitle===void 0?(s(),l(A,{key:2},[j(T(i(e).title),1)],64)):f("",!0),v(m.$slots,"nav-bar-title-after",{},void 0,!0)],8,Br)],2))}}),Dr=g(Or,[["__scopeId","data-v-2256aec7"]]),Fr={},xr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},jr=u("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Ur=u("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Gr=[jr,Ur];function Rr(n,e){return s(),l("svg",xr,Gr)}const Pt=g(Fr,[["render",Rr]]),qr={class:"items"},Kr={class:"title"},Wr=b({__name:"VPNavBarTranslations",setup(n){const{theme:e}=z(),{localeLinks:t,currentLang:o}=_e({correspondingLink:!0});return(a,r)=>i(t).length&&i(o).label?(s(),y(et,{key:0,class:"VPNavBarTranslations",icon:Pt,label:i(e).langMenuLabel||"Change language"},{default:p(()=>[u("div",qr,[u("p",Kr,T(i(o).label),1),(s(!0),l(A,null,G(i(t),c=>(s(),y(Ie,{key:c.link,item:c},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}}),Yr=g(Wr,[["__scopeId","data-v-56a52592"]]),Zr=n=>(Z("data-v-9ec51abf"),n=n(),X(),n),Xr={class:"wrapper"},Jr={class:"container"},Qr={class:"title"},ei={class:"content"},ti={class:"content-body"},ni=Zr(()=>u("div",{class:"divider"},[u("div",{class:"divider-line"})],-1)),oi=b({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(n){const{y:e}=vt(),{hasSidebar:t}=ne(),{hasLocalNav:o}=kt(),{frontmatter:a}=z(),r=E({});return ut(()=>{r.value={"has-sidebar":t.value,"has-local-nav":o.value,top:a.value.layout==="home"&&e.value===0}}),(c,d)=>(s(),l("div",{class:H(["VPNavBar",r.value])},[u("div",Xr,[u("div",Jr,[u("div",Qr,[_(Dr,null,{"nav-bar-title-before":p(()=>[v(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(c.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),u("div",ei,[u("div",ti,[v(c.$slots,"nav-bar-content-before",{},void 0,!0),_(Nr,{class:"search"}),_(Lr,{class:"menu"}),_(Yr,{class:"translations"}),_(fs,{class:"appearance"}),_(Ar,{class:"social-links"}),_(cr,{class:"extra"}),v(c.$slots,"nav-bar-content-after",{},void 0,!0),_(hr,{class:"hamburger",active:c.isScreenOpen,onClick:d[0]||(d[0]=m=>c.$emit("toggle-screen"))},null,8,["active"])])])])]),ni],2))}}),ai=g(oi,[["__scopeId","data-v-9ec51abf"]]),si={key:0,class:"VPNavScreenAppearance"},ri={class:"text"},ii=b({__name:"VPNavScreenAppearance",setup(n){const{site:e,theme:t}=z();return(o,a)=>i(e).appearance&&i(e).appearance!=="force-dark"?(s(),l("div",si,[u("p",ri,T(i(t).darkModeSwitchLabel||"Appearance"),1),_(Je)])):f("",!0)}}),li=g(ii,[["__scopeId","data-v-2f05ca60"]]),ci=b({__name:"VPNavScreenMenuLink",props:{item:{}},setup(n){const e=Me("close-screen");return(t,o)=>(s(),y(K,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:p(()=>[j(T(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),ui=g(ci,[["__scopeId","data-v-13a0f76d"]]),di={},mi={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},vi=u("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),pi=[vi];function hi(n,e){return s(),l("svg",mi,pi)}const fi=g(di,[["render",hi]]),_i=b({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(n){const e=Me("close-screen");return(t,o)=>(s(),y(K,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:p(()=>[j(T(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Vt=g(_i,[["__scopeId","data-v-a77909ab"]]),gi={class:"VPNavScreenMenuGroupSection"},bi={key:0,class:"title"},ki=b({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(n){return(e,t)=>(s(),l("div",gi,[e.text?(s(),l("p",bi,T(e.text),1)):f("",!0),(s(!0),l(A,null,G(e.items,o=>(s(),y(Vt,{key:o.text,item:o},null,8,["item"]))),128))]))}}),$i=g(ki,[["__scopeId","data-v-02647012"]]),yi=["aria-controls","aria-expanded"],wi=["innerHTML"],Li=["id"],Pi={key:1,class:"group"},Vi=b({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(n){const e=n,t=E(!1),o=L(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function a(){t.value=!t.value}return(r,c)=>(s(),l("div",{class:H(["VPNavScreenMenuGroup",{open:t.value}])},[u("button",{class:"button","aria-controls":o.value,"aria-expanded":t.value,onClick:a},[u("span",{class:"button-text",innerHTML:r.text},null,8,wi),_(fi,{class:"button-icon"})],8,yi),u("div",{id:o.value,class:"items"},[(s(!0),l(A,null,G(r.items,d=>(s(),l(A,{key:d.text},["link"in d?(s(),l("div",{key:d.text,class:"item"},[_(Vt,{item:d},null,8,["item"])])):(s(),l("div",Pi,[_($i,{text:d.text,items:d.items},null,8,["text","items"])]))],64))),128))],8,Li)],2))}}),Si=g(Vi,[["__scopeId","data-v-add8adf0"]]),zi={key:0,class:"VPNavScreenMenu"},Ci=b({__name:"VPNavScreenMenu",setup(n){const{theme:e}=z();return(t,o)=>i(e).nav?(s(),l("nav",zi,[(s(!0),l(A,null,G(i(e).nav,a=>(s(),l(A,{key:a.text},["link"in a?(s(),y(ui,{key:0,item:a},null,8,["item"])):(s(),y(Si,{key:1,text:a.text||"",items:a.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Ti=b({__name:"VPNavScreenSocialLinks",setup(n){const{theme:e}=z();return(t,o)=>i(e).socialLinks?(s(),y(Ee,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):f("",!0)}}),Mi={class:"list"},Ii=b({__name:"VPNavScreenTranslations",setup(n){const{localeLinks:e,currentLang:t}=_e({correspondingLink:!0}),o=E(!1);function a(){o.value=!o.value}return(r,c)=>i(e).length&&i(t).label?(s(),l("div",{key:0,class:H(["VPNavScreenTranslations",{open:o.value}])},[u("button",{class:"title",onClick:a},[_(Pt,{class:"icon lang"}),j(" "+T(i(t).label)+" ",1),_(Lt,{class:"icon chevron"})]),u("ul",Mi,[(s(!0),l(A,null,G(i(e),d=>(s(),l("li",{key:d.link,class:"item"},[_(K,{class:"link",href:d.link},{default:p(()=>[j(T(d.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}}),Ei=g(Ii,[["__scopeId","data-v-e924fe42"]]),Ni={class:"container"},Hi=b({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(n){const e=E(null),t=ht(le?document.body:null);return(o,a)=>(s(),y(ze,{name:"fade",onEnter:a[0]||(a[0]=r=>t.value=!0),onAfterLeave:a[1]||(a[1]=r=>t.value=!1)},{default:p(()=>[o.open?(s(),l("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[u("div",Ni,[v(o.$slots,"nav-screen-content-before",{},void 0,!0),_(Ci,{class:"menu"}),_(Ei,{class:"translations"}),_(li,{class:"appearance"}),_(Ti,{class:"social-links"}),v(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}}),Ai=g(Hi,[["__scopeId","data-v-b4543032"]]),Bi={key:0,class:"VPNav"},Oi=b({__name:"VPNav",setup(n){const{isScreenOpen:e,closeScreen:t,toggleScreen:o}=Wa(),{frontmatter:a}=z(),r=L(()=>a.value.navbar!==!1);return ft("close-screen",t),Ce(()=>{le&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(c,d)=>r.value?(s(),l("header",Bi,[_(ai,{"is-screen-open":i(e),onToggleScreen:i(o)},{"nav-bar-title-before":p(()=>[v(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(c.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[v(c.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[v(c.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),_(Ai,{open:i(e)},{"nav-screen-content-before":p(()=>[v(c.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[v(c.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}}),Di=g(Oi,[["__scopeId","data-v-ca0a69ce"]]),Fi=n=>(Z("data-v-eb64199c"),n=n(),X(),n),xi=["role","tabindex"],ji=Fi(()=>u("div",{class:"indicator"},null,-1)),Ui={key:1,class:"items"},Gi=b({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(n){const e=n,{collapsed:t,collapsible:o,isLink:a,isActiveLink:r,hasActiveLink:c,hasChildren:d,toggle:m}=yn(L(()=>e.item)),k=L(()=>d.value?"section":"div"),$=L(()=>a.value?"a":"div"),w=L(()=>d.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),S=L(()=>a.value?void 0:"button"),B=L(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:t.value},{"is-link":a.value},{"is-active":r.value},{"has-active":c.value}]);function V(N){"key"in N&&N.key!=="Enter"||!e.item.link&&m()}function I(){e.item.link&&m()}return(N,ue)=>{const J=ce("VPSidebarItem",!0);return s(),y(re(k.value),{class:H(["VPSidebarItem",B.value])},{default:p(()=>[N.item.text?(s(),l("div",we({key:0,class:"item",role:S.value},Zt(N.item.items?{click:V,keydown:V}:{},!0),{tabindex:N.item.items&&0}),[ji,N.item.link?(s(),y(K,{key:0,tag:$.value,class:"link",href:N.item.link,rel:N.item.rel,target:N.item.target},{default:p(()=>[(s(),y(re(w.value),{class:"text",innerHTML:N.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),y(re(w.value),{key:1,class:"text",innerHTML:N.item.text},null,8,["innerHTML"])),N.item.collapsed!=null?(s(),l("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:I,onKeydown:Xt(I,["enter"]),tabindex:"0"},[_($t,{class:"caret-icon"})],32)):f("",!0)],16,xi)):f("",!0),N.item.items&&N.item.items.length?(s(),l("div",Ui,[N.depth<5?(s(!0),l(A,{key:0},G(N.item.items,F=>(s(),y(J,{key:F.text,item:F,depth:N.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}}),Ri=g(Gi,[["__scopeId","data-v-eb64199c"]]),St=n=>(Z("data-v-7b6857b5"),n=n(),X(),n),qi=St(()=>u("div",{class:"curtain"},null,-1)),Ki={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Wi=St(()=>u("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Yi=b({__name:"VPSidebar",props:{open:{type:Boolean}},setup(n){const{sidebarGroups:e,hasSidebar:t}=ne(),o=n,a=E(null),r=ht(le?document.body:null);return te([o,a],()=>{var c;o.open?(r.value=!0,(c=a.value)==null||c.focus()):r.value=!1},{immediate:!0,flush:"post"}),(c,d)=>i(t)?(s(),l("aside",{key:0,class:H(["VPSidebar",{open:c.open}]),ref_key:"navEl",ref:a,onClick:d[0]||(d[0]=Jt(()=>{},["stop"]))},[qi,u("nav",Ki,[Wi,v(c.$slots,"sidebar-nav-before",{},void 0,!0),(s(!0),l(A,null,G(i(e),m=>(s(),l("div",{key:m.text,class:"group"},[_(Ri,{item:m,depth:0},null,8,["item"])]))),128)),v(c.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}}),Zi=g(Yi,[["__scopeId","data-v-7b6857b5"]]),Xi=b({__name:"VPSkipLink",setup(n){const e=fe(),t=E();te(()=>e.path,()=>t.value.focus());function o({target:a}){const r=document.getElementById(decodeURIComponent(a.hash).slice(1));if(r){const c=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",c)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",c),r.focus(),window.scrollTo(0,0)}}return(a,r)=>(s(),l(A,null,[u("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),u("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}}),Ji=g(Xi,[["__scopeId","data-v-2cc3dcc2"]]),Qi=b({__name:"Layout",setup(n){const{isOpen:e,open:t,close:o}=ne(),a=fe();te(()=>a.path,o),$n(e,o);const{frontmatter:r}=z(),c=Qt(),d=L(()=>!!c["home-hero-image"]);return ft("hero-image-slot-exists",d),(m,k)=>{const $=ce("Content");return i(r).layout!==!1?(s(),l("div",{key:0,class:H(["Layout",i(r).pageClass])},[v(m.$slots,"layout-top",{},void 0,!0),_(Ji),_(sn,{class:"backdrop",show:i(e),onClick:i(o)},null,8,["show","onClick"]),_(Di,null,{"nav-bar-title-before":p(()=>[v(m.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(m.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[v(m.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[v(m.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[v(m.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[v(m.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),_(Ka,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),_(Zi,{open:i(e)},{"sidebar-nav-before":p(()=>[v(m.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[v(m.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),_(ba,null,{"page-top":p(()=>[v(m.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[v(m.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[v(m.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[v(m.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[v(m.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(m.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[v(m.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[v(m.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[v(m.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[v(m.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[v(m.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[v(m.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[v(m.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[v(m.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[v(m.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[v(m.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[v(m.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(m.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(m.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(m.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),_(La),v(m.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),y($,{key:1}))}}}),el=g(Qi,[["__scopeId","data-v-6b5043bc"]]),tl={},nl={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},ol=u("path",{d:"M12,22.2c-0.3,0-0.5-0.1-0.7-0.3l-8.8-8.8c-2.5-2.5-2.5-6.7,0-9.2c2.5-2.5,6.7-2.5,9.2,0L12,4.3l0.4-0.4c0,0,0,0,0,0C13.6,2.7,15.2,2,16.9,2c0,0,0,0,0,0c1.7,0,3.4,0.7,4.6,1.9l0,0c1.2,1.2,1.9,2.9,1.9,4.6c0,1.7-0.7,3.4-1.9,4.6l-8.8,8.8C12.5,22.1,12.3,22.2,12,22.2zM7,4C5.9,4,4.7,4.4,3.9,5.3c-1.8,1.8-1.8,4.6,0,6.4l8.1,8.1l8.1-8.1c0.9-0.9,1.3-2,1.3-3.2c0-1.2-0.5-2.3-1.3-3.2l0,0C19.3,4.5,18.2,4,17,4c0,0,0,0,0,0c-1.2,0-2.3,0.5-3.2,1.3c0,0,0,0,0,0l-1.1,1.1c-0.4,0.4-1,0.4-1.4,0l-1.1-1.1C9.4,4.4,8.2,4,7,4z"},null,-1),al=[ol];function sl(n,e){return s(),l("svg",nl,al)}const rl=g(tl,[["render",sl]]),il={},ll={class:"VPTeamPage"};function cl(n,e){return s(),l("div",ll,[v(n.$slots,"default")])}const oc=g(il,[["render",cl],["__scopeId","data-v-0dac1e67"]]),ul={},dl={class:"VPTeamPageTitle"},ml={key:0,class:"title"},vl={key:1,class:"lead"};function pl(n,e){return s(),l("div",dl,[n.$slots.title?(s(),l("h1",ml,[v(n.$slots,"title",{},void 0,!0)])):f("",!0),n.$slots.lead?(s(),l("p",vl,[v(n.$slots,"lead",{},void 0,!0)])):f("",!0)])}const ac=g(ul,[["render",pl],["__scopeId","data-v-867cfc0f"]]),hl={class:"profile"},fl={class:"avatar"},_l=["src","alt"],gl={class:"data"},bl={class:"name"},kl={key:0,class:"affiliation"},$l={key:0,class:"title"},yl={key:1,class:"at"},wl=["innerHTML"],Ll={key:2,class:"links"},Pl={key:0,class:"sp"},Vl=b({__name:"VPTeamMembersItem",props:{size:{default:"medium"},member:{}},setup(n){return(e,t)=>(s(),l("article",{class:H(["VPTeamMembersItem",[e.size]])},[u("div",hl,[u("figure",fl,[u("img",{class:"avatar-img",src:e.member.avatar,alt:e.member.name},null,8,_l)]),u("div",gl,[u("h1",bl,T(e.member.name),1),e.member.title||e.member.org?(s(),l("p",kl,[e.member.title?(s(),l("span",$l,T(e.member.title),1)):f("",!0),e.member.title&&e.member.org?(s(),l("span",yl," @ ")):f("",!0),e.member.org?(s(),y(K,{key:2,class:H(["org",{link:e.member.orgLink}]),href:e.member.orgLink,"no-icon":""},{default:p(()=>[j(T(e.member.org),1)]),_:1},8,["class","href"])):f("",!0)])):f("",!0),e.member.desc?(s(),l("p",{key:1,class:"desc",innerHTML:e.member.desc},null,8,wl)):f("",!0),e.member.links?(s(),l("div",Ll,[_(Ee,{links:e.member.links},null,8,["links"])])):f("",!0)])]),e.member.sponsor?(s(),l("div",Pl,[_(K,{class:"sp-link",href:e.member.sponsor,"no-icon":""},{default:p(()=>[_(rl,{class:"sp-icon"}),j(" "+T(e.member.actionText||"Sponsor"),1)]),_:1},8,["href"])])):f("",!0)],2))}}),Sl=g(Vl,[["__scopeId","data-v-c8b9bdef"]]),zl={class:"container"},Cl=b({__name:"VPTeamMembers",props:{size:{default:"medium"},members:{}},setup(n){const e=n,t=L(()=>[e.size,`count-${e.members.length}`]);return(o,a)=>(s(),l("div",{class:H(["VPTeamMembers",t.value])},[u("div",zl,[(s(!0),l(A,null,G(o.members,r=>(s(),l("div",{key:r.name,class:"item"},[_(Sl,{size:o.size,member:r},null,8,["size","member"])]))),128))])],2))}}),sc=g(Cl,[["__scopeId","data-v-130c6a1d"]]),st={Layout:el,enhanceApp:({app:n})=>{n.component("Badge",nn)}},Tl=["id","host","repo","repoid","category","categoryid","mapping","term","strict","reactionsenabled","emitmetadata","inputposition","theme","lang","loading"],Ml=b({__name:"Giscus",props:{id:{},host:{},repo:{},repoId:{},category:{},categoryId:{},mapping:{},term:{},theme:{},strict:{},reactionsEnabled:{},emitMetadata:{},inputPosition:{},lang:{},loading:{}},setup(n){const e=E(!1);return Y(()=>{e.value=!0,pt(()=>import("./giscus-aTimukGI.CKTvSCx2.js"),[])}),(t,o)=>e.value?(s(),l("giscus-widget",{key:0,id:t.id,host:t.host,repo:t.repo,repoid:t.repoId,category:t.category,categoryid:t.categoryId,mapping:t.mapping,term:t.term,strict:t.strict,reactionsenabled:t.reactionsEnabled,emitmetadata:t.emitMetadata,inputposition:t.inputPosition,theme:t.theme,lang:t.lang,loading:t.loading},null,8,Tl)):f("",!0)}}),rt=(n,e,t=!0)=>{var k;const o={id:"comment",host:"https://giscus.app",category:"General",mapping:"pathname",term:"Welcome to giscus!",reactionsEnabled:"1",inputPosition:"top",lang:"zh-CN",loading:"lazy",repo:"xxx/xxx",repoId:"",homePageShowComment:!1};if(n.locales){const w=document.querySelector("html").getAttribute("lang");w&&n.locales[w]&&(n.lang=n.locales[w])}const a=n.lightTheme||"light",r=n.darkTheme||"transparent_dark";let c=document.getElementById("giscus");if(c&&c.parentNode.removeChild(c),(e==null?void 0:e.value.comment)!==void 0){if(!(e!=null&&e.value.comment))return}else if(!t)return;if(!n.homePageShowComment&&(!location.pathname||location.pathname==="/"))return;const d=((k=document.querySelector("html"))==null?void 0:k.className.indexOf("dark"))!==-1,m=document.getElementsByClassName("content-container")[0];if(m){const $=document.createElement("div");$.setAttribute("id","giscus"),$.style.height="auto",$.style.marginTop="40px",$.style.borderTop="1px solid var(--vp-c-divider)",$.style.paddingTop="20px",m.append($),en({render:()=>Ve(Ml,{...o,theme:d?r:a,...n})}).mount("#giscus")}},Il=n=>{const e=document.querySelector("html"),t=n.lightTheme||"light",o=n.darkTheme||"transparent_dark";new MutationObserver(r=>{r.forEach(c=>{if(c.type=="attributes"){let d=document.getElementById("comment");d==null||d.setAttribute("theme",e.className.indexOf("dark")!==-1?o:t)}})}).observe(e,{attributeFilter:["class"]})},El=(n,e,t=!0)=>{Y(()=>{rt(n,e.frontmatter,t),Il(n)}),te(()=>e.route.path,()=>We(()=>{rt(n,e.frontmatter,t)}))};/*! medium-zoom 1.1.0 | MIT License | https://github.com/francoischalifour/medium-zoom */var se=Object.assign||function(n){for(var e=1;e1&&arguments[1]!==void 0?arguments[1]:{},o=window.Promise||function(P){function C(){}P(C,C)},a=function(P){var C=P.target;if(C===ge){V();return}F.indexOf(C)!==-1&&I({target:C})},r=function(){if(!(Q||!h.original)){var P=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(tt-P)>O.scrollOffset&&setTimeout(V,150)}},c=function(P){var C=P.key||P.keyCode;(C==="Escape"||C==="Esc"||C===27)&&V()},d=function(){var P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},C=P;if(P.background&&(ge.style.background=P.background),P.container&&P.container instanceof Object&&(C.container=se({},O.container,P.container)),P.template){var D=Pe(P.template)?P.template:document.querySelector(P.template);C.template=D}return O=se({},O,C),F.forEach(function(x){x.dispatchEvent(me("medium-zoom:update",{detail:{zoom:U}}))}),U},m=function(){var P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return n(se({},O,P))},k=function(){for(var P=arguments.length,C=Array(P),D=0;D0?C.reduce(function(M,q){return[].concat(M,lt(q))},[]):F;return x.forEach(function(M){M.classList.remove("medium-zoom-image"),M.dispatchEvent(me("medium-zoom:detach",{detail:{zoom:U}}))}),F=F.filter(function(M){return x.indexOf(M)===-1}),U},w=function(P,C){var D=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return F.forEach(function(x){x.addEventListener("medium-zoom:"+P,C,D)}),oe.push({type:"medium-zoom:"+P,listener:C,options:D}),U},S=function(P,C){var D=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return F.forEach(function(x){x.removeEventListener("medium-zoom:"+P,C,D)}),oe=oe.filter(function(x){return!(x.type==="medium-zoom:"+P&&x.listener.toString()===C.toString())}),U},B=function(){var P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},C=P.target,D=function(){var M={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},q=void 0,W=void 0;if(O.container)if(O.container instanceof Object)M=se({},M,O.container),q=M.width-M.left-M.right-O.margin*2,W=M.height-M.top-M.bottom-O.margin*2;else{var de=Pe(O.container)?O.container:document.querySelector(O.container),ae=de.getBoundingClientRect(),Ne=ae.width,Mt=ae.height,It=ae.left,Et=ae.top;M=se({},M,{width:Ne,height:Mt,left:It,top:Et})}q=q||M.width-O.margin*2,W=W||M.height-O.margin*2;var he=h.zoomedHd||h.original,Nt=it(he)?q:he.naturalWidth||q,Ht=it(he)?W:he.naturalHeight||W,be=he.getBoundingClientRect(),At=be.top,Bt=be.left,He=be.width,Ae=be.height,Ot=Math.min(Math.max(He,Nt),q)/He,Dt=Math.min(Math.max(Ae,Ht),W)/Ae,Be=Math.min(Ot,Dt),Ft=(-Bt+(q-He)/2+O.margin+M.left)/Be,xt=(-At+(W-Ae)/2+O.margin+M.top)/Be,nt="scale("+Be+") translate3d("+Ft+"px, "+xt+"px, 0)";h.zoomed.style.transform=nt,h.zoomedHd&&(h.zoomedHd.style.transform=nt)};return new o(function(x){if(C&&F.indexOf(C)===-1){x(U);return}var M=function Ne(){Q=!1,h.zoomed.removeEventListener("transitionend",Ne),h.original.dispatchEvent(me("medium-zoom:opened",{detail:{zoom:U}})),x(U)};if(h.zoomed){x(U);return}if(C)h.original=C;else if(F.length>0){var q=F;h.original=q[0]}else{x(U);return}if(h.original.dispatchEvent(me("medium-zoom:open",{detail:{zoom:U}})),tt=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,Q=!0,h.zoomed=Al(h.original),document.body.appendChild(ge),O.template){var W=Pe(O.template)?O.template:document.querySelector(O.template);h.template=document.createElement("div"),h.template.appendChild(W.content.cloneNode(!0)),document.body.appendChild(h.template)}if(h.original.parentElement&&h.original.parentElement.tagName==="PICTURE"&&h.original.currentSrc&&(h.zoomed.src=h.original.currentSrc),document.body.appendChild(h.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),h.original.classList.add("medium-zoom-image--hidden"),h.zoomed.classList.add("medium-zoom-image--opened"),h.zoomed.addEventListener("click",V),h.zoomed.addEventListener("transitionend",M),h.original.getAttribute("data-zoom-src")){h.zoomedHd=h.zoomed.cloneNode(),h.zoomedHd.removeAttribute("srcset"),h.zoomedHd.removeAttribute("sizes"),h.zoomedHd.removeAttribute("loading"),h.zoomedHd.src=h.zoomed.getAttribute("data-zoom-src"),h.zoomedHd.onerror=function(){clearInterval(de),console.warn("Unable to reach the zoom image target "+h.zoomedHd.src),h.zoomedHd=null,D()};var de=setInterval(function(){h.zoomedHd.complete&&(clearInterval(de),h.zoomedHd.classList.add("medium-zoom-image--opened"),h.zoomedHd.addEventListener("click",V),document.body.appendChild(h.zoomedHd),D())},10)}else if(h.original.hasAttribute("srcset")){h.zoomedHd=h.zoomed.cloneNode(),h.zoomedHd.removeAttribute("sizes"),h.zoomedHd.removeAttribute("loading");var ae=h.zoomedHd.addEventListener("load",function(){h.zoomedHd.removeEventListener("load",ae),h.zoomedHd.classList.add("medium-zoom-image--opened"),h.zoomedHd.addEventListener("click",V),document.body.appendChild(h.zoomedHd),D()})}else D()})},V=function(){return new o(function(P){if(Q||!h.original){P(U);return}var C=function D(){h.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(h.zoomed),h.zoomedHd&&document.body.removeChild(h.zoomedHd),document.body.removeChild(ge),h.zoomed.classList.remove("medium-zoom-image--opened"),h.template&&document.body.removeChild(h.template),Q=!1,h.zoomed.removeEventListener("transitionend",D),h.original.dispatchEvent(me("medium-zoom:closed",{detail:{zoom:U}})),h.original=null,h.zoomed=null,h.zoomedHd=null,h.template=null,P(U)};Q=!0,document.body.classList.remove("medium-zoom--opened"),h.zoomed.style.transform="",h.zoomedHd&&(h.zoomedHd.style.transform=""),h.template&&(h.template.style.transition="opacity 150ms",h.template.style.opacity=0),h.original.dispatchEvent(me("medium-zoom:close",{detail:{zoom:U}})),h.zoomed.addEventListener("transitionend",C)})},I=function(){var P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},C=P.target;return h.original?V():B({target:C})},N=function(){return O},ue=function(){return F},J=function(){return h.original},F=[],oe=[],Q=!1,tt=0,O=t,h={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(e)==="[object Object]"?O=e:(e||typeof e=="string")&&k(e),O=se({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},O);var ge=Hl(O.background);document.addEventListener("click",a),document.addEventListener("keyup",c),document.addEventListener("scroll",r),window.addEventListener("resize",V);var U={open:B,close:V,toggle:I,update:d,clone:m,attach:k,detach:$,on:w,off:S,getOptions:N,getImages:ue,getZoomedImage:J};return U};function Ol(n,e){e===void 0&&(e={});var t=e.insertAt;if(!(typeof document>"u")){var o=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css",t==="top"&&o.firstChild?o.insertBefore(a,o.firstChild):o.appendChild(a),a.styleSheet?a.styleSheet.cssText=n:a.appendChild(document.createTextNode(n))}}var Dl=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";Ol(Dl);const Fl=n=>(Z("data-v-09295527"),n=n(),X(),n),xl=Fl(()=>u("svg",{class:"icon-top",viewBox:"0 0 48 48",fill:"none",xmlns:"http://www.w3.org/2000/svg",stroke:"currentColor","stroke-width":"4","stroke-linecap":"butt","stroke-linejoin":"miter"},[u("path",{d:"M39.6 30.557 24.043 15 8.487 30.557"})],-1)),jl=[xl],Ul=b({__name:"back-to-top",props:{threshold:{default:300}},setup(n){const e=n,t=E(0),o=L(()=>t.value>e.threshold);Y(()=>{t.value=a(),window.addEventListener("scroll",c(()=>{t.value=a()},100))});function a(){return window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0}function r(){window.scrollTo({top:0,behavior:"smooth"}),t.value=0}function c(d,m=100){let k;return(...$)=>{clearTimeout(k),k=setTimeout(()=>{d.apply(null,$)},m)}}return(d,m)=>(s(),y(ze,{name:"fade"},{default:p(()=>[i(o)?(s(),l("div",{key:0,class:"go-to-top",onClick:r},jl)):f("",!0)]),_:1}))}}),Gl=(n,e)=>{const t=n.__vccOpts||n;for(const[o,a]of e)t[o]=a;return t},Rl=Gl(Ul,[["__scopeId","data-v-09295527"]]),ql=n=>{typeof window>"u"||window.addEventListener("load",()=>{const e=document.createElement("div");document.body.appendChild(e),tn(Ve(Rl,{threshold:n==null?void 0:n.threshold}),e)})};function Kl(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var zt,pe,ee,Ct,De,ct,ve,$e=!1,ye=[];typeof document<"u"&&(Ct=function(n){return $e||document.readyState==="interactive"||document.readyState==="complete"?n.call(document):ye.push(function(){return n.call(this)}),this},ct=function(){for(var n=0,e=ye.length;n{pe&&pe.hides(),zt.fetch("//busuanzi.ibruce.info/busuanzi?jsonpCallback=BusuanziCallback",function(n){pe.texts(n),pe.shows()})};pe={bszs:["site_pv","page_pv","site_uv"],texts:function(n){this.bszs.map(function(e){var t=document.getElementById("busuanzi_value_"+e);t&&(t.innerHTML=n[e])})},hides:function(){this.bszs.map(function(n){var e=document.getElementById("busuanzi_container_"+n);e&&(e.style.display="none")})},shows:function(){this.bszs.map(function(n){var e=document.getElementById("busuanzi_container_"+n);e&&(e.style.display="inline")})}};typeof document<"u"&&Tt();var Wl={fetch:Tt},Yl=Wl;const Zl=Kl(Yl),Xl={class:"page_info"},Jl={key:0,class:"page_info_item"},Ql={key:1,class:"page_info_item"},ec=u("span",{class:"page_info_item"},[j(" 📔 "),u("span",{id:"busuanzi_container_page_pv"},[j(" 阅读量:"),u("span",{id:"busuanzi_value_page_pv"})])],-1),tc={__name:"PageInfo",setup(n){const{frontmatter:e}=Re();return(t,o)=>(s(),l("div",Xl,[i(e).Author?(s(),l("span",Jl,[j(" 🎨 "),u("span",null,"作者:"+T(i(e).Author),1)])):f("",!0),i(e).date?(s(),l("span",Ql,[j(" 🕐 "),u("span",null,"发表于:"+T(i(e).date?i(e).date.substring(0,10):""),1)])):f("",!0),ec]))}},rc={extends:st,Layout(){return Ve(st.Layout,null,{"doc-before":()=>Ve(tc)})},enhanceApp({app:n,router:e}){le&&(e.onAfterRouteChanged=()=>{Zl.fetch()}),ql({threshold:300})},setup(){const{frontmatter:n}=Re(),e=fe(),t=()=>{Bl(".main img",{background:"var(--vp-c-bg)"})};Y(()=>{t()}),te(()=>e.path,()=>We(()=>t())),El({repo:"funny-dream/youqu3",repoId:"R_kgDOMBemKg",category:"Announcements",categoryId:"DIC_kwDOMBemKs4CgATm",mapping:"pathname",inputPosition:"top",lang:"zh-CN"},{frontmatter:n,route:e},!0)}};export{rc as R,ac as V,sc as a,oc as b,Pr as c,z as u}; diff --git a/assets/index.md.BAxrrnPv.js b/assets/index.md.DHQYfbhW.js similarity index 92% rename from assets/index.md.BAxrrnPv.js rename to assets/index.md.DHQYfbhW.js index feca4df..53f5165 100644 --- a/assets/index.md.BAxrrnPv.js +++ b/assets/index.md.DHQYfbhW.js @@ -1 +1 @@ -import{V as n,a as s,b as r}from"./chunks/theme.15PVdnDQ.js";import{c as u,I as t,w as e,p as i,o as m,a}from"./chunks/framework.CoRJFuj9.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"YouQu3","text":"Next-Gen Linux Autotest Framework","tagline":"让 Linux 自动化测试变得更简单","actions":[{"theme":"brand","text":"GitHub","link":"https://github.com/funny-dream/youqu3"},{"theme":"alt","text":"Issues","link":"https://github.com/funny-dream/youqu3/issues"}],"image":{"src":"/logo.png","alt":"YouQu3"}},"features":[{"icon":"💪","title":"新架构","details":"全新的架构设计,插件化、模块化改造,底层全面重写,优化框架接口调用机制。"},{"icon":"💥","title":"新玩法","details":"继承YouQu2诸多亮点功能的同时解决其遇到的问题,各方面全面优化,更多玩法姿势等你来解锁。"},{"icon":"🛀","title":"新体验","details":"更加简单易用、更加纯粹、扩展性和兼容性更好,一发入魂。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1721405890000}'),l={name:"index.md"},b=Object.assign(l,{setup(c){const o=[{avatar:"https://www.github.com/mikigo.png",name:"mikigo",title:"Creator",org:"YouQu3",orgLink:"https://github.com/funny-dream/youqu3",links:[{icon:"github",link:"https://github.com/mikigo"},{icon:"x",link:"https://twitter.com/mikigo_"}]},{avatar:"https://www.github.com/DarkLii.png",name:"DarkLii",title:"Developer",links:[{icon:"github",link:"https://github.com/DarkLii"}]}];return(h,g)=>(m(),u("div",null,[t(i(r),null,{default:e(()=>[t(i(n),null,{title:e(()=>[a(" Contributors ")]),lead:e(()=>[a(" 感谢以下所有人的贡献与参与 ")]),_:1}),t(i(s),{size:"small",members:o})]),_:1})]))}});export{k as __pageData,b as default}; +import{V as n,a as s,b as r}from"./chunks/theme.D89Al4wk.js";import{c as u,I as t,w as e,p as i,o as m,a}from"./chunks/framework.CoRJFuj9.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"YouQu3","text":"Next-Gen Linux Autotest Framework","tagline":"让 Linux 自动化测试变得更简单","actions":[{"theme":"brand","text":"GitHub","link":"https://github.com/funny-dream/youqu3"},{"theme":"alt","text":"Issues","link":"https://github.com/funny-dream/youqu3/issues"}],"image":{"src":"/logo.png","alt":"YouQu3"}},"features":[{"icon":"💪","title":"新架构","details":"全新的架构设计,插件化、模块化改造,底层全面重写,优化框架接口调用机制。"},{"icon":"💥","title":"新玩法","details":"继承YouQu2诸多亮点功能的同时解决其遇到的问题,各方面全面优化,更多玩法姿势等你来解锁。"},{"icon":"🛀","title":"新体验","details":"更加简单易用、更加纯粹、扩展性和兼容性更好,一发入魂。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1721408535000}'),l={name:"index.md"},b=Object.assign(l,{setup(c){const o=[{avatar:"https://www.github.com/mikigo.png",name:"mikigo",title:"Creator",org:"YouQu3",orgLink:"https://github.com/funny-dream/youqu3",links:[{icon:"github",link:"https://github.com/mikigo"},{icon:"x",link:"https://twitter.com/mikigo_"}]},{avatar:"https://www.github.com/DarkLii.png",name:"DarkLii",title:"Developer",links:[{icon:"github",link:"https://github.com/DarkLii"}]}];return(h,g)=>(m(),u("div",null,[t(i(r),null,{default:e(()=>[t(i(n),null,{title:e(()=>[a(" Contributors ")]),lead:e(()=>[a(" 感谢以下所有人的贡献与参与 ")]),_:1}),t(i(s),{size:"small",members:o})]),_:1})]))}});export{k as __pageData,b as default}; diff --git a/assets/index.md.BAxrrnPv.lean.js b/assets/index.md.DHQYfbhW.lean.js similarity index 92% rename from assets/index.md.BAxrrnPv.lean.js rename to assets/index.md.DHQYfbhW.lean.js index feca4df..53f5165 100644 --- a/assets/index.md.BAxrrnPv.lean.js +++ b/assets/index.md.DHQYfbhW.lean.js @@ -1 +1 @@ -import{V as n,a as s,b as r}from"./chunks/theme.15PVdnDQ.js";import{c as u,I as t,w as e,p as i,o as m,a}from"./chunks/framework.CoRJFuj9.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"YouQu3","text":"Next-Gen Linux Autotest Framework","tagline":"让 Linux 自动化测试变得更简单","actions":[{"theme":"brand","text":"GitHub","link":"https://github.com/funny-dream/youqu3"},{"theme":"alt","text":"Issues","link":"https://github.com/funny-dream/youqu3/issues"}],"image":{"src":"/logo.png","alt":"YouQu3"}},"features":[{"icon":"💪","title":"新架构","details":"全新的架构设计,插件化、模块化改造,底层全面重写,优化框架接口调用机制。"},{"icon":"💥","title":"新玩法","details":"继承YouQu2诸多亮点功能的同时解决其遇到的问题,各方面全面优化,更多玩法姿势等你来解锁。"},{"icon":"🛀","title":"新体验","details":"更加简单易用、更加纯粹、扩展性和兼容性更好,一发入魂。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1721405890000}'),l={name:"index.md"},b=Object.assign(l,{setup(c){const o=[{avatar:"https://www.github.com/mikigo.png",name:"mikigo",title:"Creator",org:"YouQu3",orgLink:"https://github.com/funny-dream/youqu3",links:[{icon:"github",link:"https://github.com/mikigo"},{icon:"x",link:"https://twitter.com/mikigo_"}]},{avatar:"https://www.github.com/DarkLii.png",name:"DarkLii",title:"Developer",links:[{icon:"github",link:"https://github.com/DarkLii"}]}];return(h,g)=>(m(),u("div",null,[t(i(r),null,{default:e(()=>[t(i(n),null,{title:e(()=>[a(" Contributors ")]),lead:e(()=>[a(" 感谢以下所有人的贡献与参与 ")]),_:1}),t(i(s),{size:"small",members:o})]),_:1})]))}});export{k as __pageData,b as default}; +import{V as n,a as s,b as r}from"./chunks/theme.D89Al4wk.js";import{c as u,I as t,w as e,p as i,o as m,a}from"./chunks/framework.CoRJFuj9.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"YouQu3","text":"Next-Gen Linux Autotest Framework","tagline":"让 Linux 自动化测试变得更简单","actions":[{"theme":"brand","text":"GitHub","link":"https://github.com/funny-dream/youqu3"},{"theme":"alt","text":"Issues","link":"https://github.com/funny-dream/youqu3/issues"}],"image":{"src":"/logo.png","alt":"YouQu3"}},"features":[{"icon":"💪","title":"新架构","details":"全新的架构设计,插件化、模块化改造,底层全面重写,优化框架接口调用机制。"},{"icon":"💥","title":"新玩法","details":"继承YouQu2诸多亮点功能的同时解决其遇到的问题,各方面全面优化,更多玩法姿势等你来解锁。"},{"icon":"🛀","title":"新体验","details":"更加简单易用、更加纯粹、扩展性和兼容性更好,一发入魂。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1721408535000}'),l={name:"index.md"},b=Object.assign(l,{setup(c){const o=[{avatar:"https://www.github.com/mikigo.png",name:"mikigo",title:"Creator",org:"YouQu3",orgLink:"https://github.com/funny-dream/youqu3",links:[{icon:"github",link:"https://github.com/mikigo"},{icon:"x",link:"https://twitter.com/mikigo_"}]},{avatar:"https://www.github.com/DarkLii.png",name:"DarkLii",title:"Developer",links:[{icon:"github",link:"https://github.com/DarkLii"}]}];return(h,g)=>(m(),u("div",null,[t(i(r),null,{default:e(()=>[t(i(n),null,{title:e(()=>[a(" Contributors ")]),lead:e(()=>[a(" 感谢以下所有人的贡献与参与 ")]),_:1}),t(i(s),{size:"small",members:o})]),_:1})]))}});export{k as __pageData,b as default}; diff --git "a/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.8tXxk_G9.js" "b/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.D5w4ani5.js" similarity index 83% rename from "assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.8tXxk_G9.js" rename to "assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.D5w4ani5.js" index b040b81..c9c54de 100644 --- "a/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.8tXxk_G9.js" +++ "b/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.D5w4ani5.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/方法开发.md","filePath":"实践/方法开发.md","lastUpdated":1721405890000}'),r={name:"实践/方法开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/方法开发.md","filePath":"实践/方法开发.md","lastUpdated":1721408535000}'),r={name:"实践/方法开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.8tXxk_G9.lean.js" "b/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.D5w4ani5.lean.js" similarity index 83% rename from "assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.8tXxk_G9.lean.js" rename to "assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.D5w4ani5.lean.js" index b040b81..c9c54de 100644 --- "a/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.8tXxk_G9.lean.js" +++ "b/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.D5w4ani5.lean.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/方法开发.md","filePath":"实践/方法开发.md","lastUpdated":1721405890000}'),r={name:"实践/方法开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/方法开发.md","filePath":"实践/方法开发.md","lastUpdated":1721408535000}'),r={name:"实践/方法开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.BV_W8rlS.js" "b/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.EtGquKvU.js" similarity index 83% rename from "assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.BV_W8rlS.js" rename to "assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.EtGquKvU.js" index 3be7ec7..2fb82c5 100644 --- "a/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.BV_W8rlS.js" +++ "b/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.EtGquKvU.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/用例开发.md","filePath":"实践/用例开发.md","lastUpdated":1721405890000}'),r={name:"实践/用例开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/用例开发.md","filePath":"实践/用例开发.md","lastUpdated":1721408535000}'),r={name:"实践/用例开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.BV_W8rlS.lean.js" "b/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.EtGquKvU.lean.js" similarity index 83% rename from "assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.BV_W8rlS.lean.js" rename to "assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.EtGquKvU.lean.js" index 3be7ec7..2fb82c5 100644 --- "a/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.BV_W8rlS.lean.js" +++ "b/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.EtGquKvU.lean.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/用例开发.md","filePath":"实践/用例开发.md","lastUpdated":1721405890000}'),r={name:"实践/用例开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/用例开发.md","filePath":"实践/用例开发.md","lastUpdated":1721408535000}'),r={name:"实践/用例开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DhjgHtMS.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DRi-K-t9.js" similarity index 99% rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DhjgHtMS.js" rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DRi-K-t9.js" index 1945b08..77900a5 100644 --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DhjgHtMS.js" +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DRi-K-t9.js" @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"JSON 报告","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/JSON报告.md","filePath":"指南/与生俱来/JSON报告.md","lastUpdated":1721405890000}'),t={name:"指南/与生俱来/JSON报告.md"},h=n(`

JSON 报告

框架默认生成 JSON 报告,在用例工程目录下生成报告文件: /report/json/report_xxxx.json

报告内容

整体结构

json
{
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"JSON 报告","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/JSON报告.md","filePath":"指南/与生俱来/JSON报告.md","lastUpdated":1721408535000}'),t={name:"指南/与生俱来/JSON报告.md"},h=n(`

JSON 报告

框架默认生成 JSON 报告,在用例工程目录下生成报告文件: /report/json/report_xxxx.json

报告内容

整体结构

json
{
     "created": 1518371686.7981803,
     "duration": 0.1235666275024414,
     "exitcode": 1,
diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DhjgHtMS.lean.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DRi-K-t9.lean.js"
similarity index 86%
rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DhjgHtMS.lean.js"
rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DRi-K-t9.lean.js"
index d2f9440..2dc2568 100644
--- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DhjgHtMS.lean.js"
+++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DRi-K-t9.lean.js"
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"JSON 报告","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/JSON报告.md","filePath":"指南/与生俱来/JSON报告.md","lastUpdated":1721405890000}'),t={name:"指南/与生俱来/JSON报告.md"},h=n("",19),l=[h];function k(p,e,E,o,r,d){return a(),i("div",null,l)}const c=s(t,[["render",k]]);export{y as __pageData,c as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"JSON 报告","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/JSON报告.md","filePath":"指南/与生俱来/JSON报告.md","lastUpdated":1721408535000}'),t={name:"指南/与生俱来/JSON报告.md"},h=n("",19),l=[h];function k(p,e,E,o,r,d){return a(),i("div",null,l)}const c=s(t,[["render",k]]);export{y as __pageData,c as default};
diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BLUY55a-.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.DAHkI26O.js"
similarity index 99%
rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BLUY55a-.js"
rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.DAHkI26O.js"
index 9be6abd..2d807cd 100644
--- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BLUY55a-.js"
+++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.DAHkI26O.js"
@@ -1,4 +1,4 @@
-import{_ as n,c as t,m as s,a as i,t as p,U as l,o as h}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"全自动日志","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/全自动日志.md","filePath":"指南/与生俱来/全自动日志.md","lastUpdated":1721405890000}'),e={name:"指南/与生俱来/全自动日志.md"},k=l(`

全自动日志

背景

基于 YouQu3 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作;

传统的日志输出方式,需要在每个函数里面主动编写日志输出代码 ,例如:

python
class AppMethod:
+import{_ as n,c as t,m as s,a as i,t as p,U as l,o as h}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"全自动日志","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/全自动日志.md","filePath":"指南/与生俱来/全自动日志.md","lastUpdated":1721408535000}'),e={name:"指南/与生俱来/全自动日志.md"},k=l(`

全自动日志

背景

基于 YouQu3 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作;

传统的日志输出方式,需要在每个函数里面主动编写日志输出代码 ,例如:

python
class AppMethod:
     
     def click_xxx_by_attr(self):
         """点击某个元素"""
diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BLUY55a-.lean.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.DAHkI26O.lean.js"
similarity index 94%
rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BLUY55a-.lean.js"
rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.DAHkI26O.lean.js"
index 09489eb..975b73b 100644
--- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BLUY55a-.lean.js"
+++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.DAHkI26O.lean.js"
@@ -1 +1 @@
-import{_ as n,c as t,m as s,a as i,t as p,U as l,o as h}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"全自动日志","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/全自动日志.md","filePath":"指南/与生俱来/全自动日志.md","lastUpdated":1721405890000}'),e={name:"指南/与生俱来/全自动日志.md"},k=l("",28),d=s("p",null,[i("没错,这就是我们参考"),s("code",null,"Django"),i(" 和 "),s("code",null,"jinja2"),i(" 的模板语法设计出的"),s("strong",null,"日志模板语法"),i(",使用方法很简单,"),s("strong",null,"用两对大括号把函数的参数括起来"),i(",这样在日志输出的时候就能把调用函数时参数的值输出出来。")],-1);function r(a,o,g,E,c,y){return h(),t("div",null,[k,s("p",null,[i("通过观察前面的例子,细心的同学可能还发现了一个小细节:函数功能说明中,两对大括号中的内容 "),s("code",null,p(a.elements),1),i(" 作为变量输出出来了;")]),d])}const C=n(e,[["render",r]]);export{u as __pageData,C as default};
+import{_ as n,c as t,m as s,a as i,t as p,U as l,o as h}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"全自动日志","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/全自动日志.md","filePath":"指南/与生俱来/全自动日志.md","lastUpdated":1721408535000}'),e={name:"指南/与生俱来/全自动日志.md"},k=l("",28),d=s("p",null,[i("没错,这就是我们参考"),s("code",null,"Django"),i(" 和 "),s("code",null,"jinja2"),i(" 的模板语法设计出的"),s("strong",null,"日志模板语法"),i(",使用方法很简单,"),s("strong",null,"用两对大括号把函数的参数括起来"),i(",这样在日志输出的时候就能把调用函数时参数的值输出出来。")],-1);function r(a,o,g,E,c,y){return h(),t("div",null,[k,s("p",null,[i("通过观察前面的例子,细心的同学可能还发现了一个小细节:函数功能说明中,两对大括号中的内容 "),s("code",null,p(a.elements),1),i(" 作为变量输出出来了;")]),d])}const C=n(e,[["render",r]]);export{u as __pageData,C as default};
diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.B7qfwbgF.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.9jPcVsFG.js"
similarity index 99%
rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.B7qfwbgF.js"
rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.9jPcVsFG.js"
index 3adf57c..a2b5485 100644
--- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.B7qfwbgF.js"
+++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.9jPcVsFG.js"
@@ -1,4 +1,4 @@
-import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const F=JSON.parse('{"title":"前后钩子","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/前后钩子.md","filePath":"指南/与生俱来/前后钩子.md","lastUpdated":1721405890000}'),e={name:"指南/与生俱来/前后钩子.md"},h=t(`

前后钩子

YouQu3 提供灵活的前后钩子机制。

前置钩子

前置脚本钩子

在用例工程目录下存放一个 job_start.py 的脚本,框架会在用例执行之前自动加载并执行。

bash
my_case
+import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const F=JSON.parse('{"title":"前后钩子","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/前后钩子.md","filePath":"指南/与生俱来/前后钩子.md","lastUpdated":1721408535000}'),e={name:"指南/与生俱来/前后钩子.md"},h=t(`

前后钩子

YouQu3 提供灵活的前后钩子机制。

前置钩子

前置脚本钩子

在用例工程目录下存放一个 job_start.py 的脚本,框架会在用例执行之前自动加载并执行。

bash
my_case
 ├── case
 ├── method
 ├── job_start.py
diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.B7qfwbgF.lean.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.9jPcVsFG.lean.js"
similarity index 86%
rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.B7qfwbgF.lean.js"
rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.9jPcVsFG.lean.js"
index d7503b6..223db1f 100644
--- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.B7qfwbgF.lean.js"
+++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.9jPcVsFG.lean.js"
@@ -1 +1 @@
-import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const F=JSON.parse('{"title":"前后钩子","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/前后钩子.md","filePath":"指南/与生俱来/前后钩子.md","lastUpdated":1721405890000}'),e={name:"指南/与生俱来/前后钩子.md"},h=t("",21),n=[h];function l(p,o,d,k,r,c){return i(),a("div",null,n)}const g=s(e,[["render",l]]);export{F as __pageData,g as default};
+import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const F=JSON.parse('{"title":"前后钩子","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/前后钩子.md","filePath":"指南/与生俱来/前后钩子.md","lastUpdated":1721408535000}'),e={name:"指南/与生俱来/前后钩子.md"},h=t("",21),n=[h];function l(p,o,d,k,r,c){return i(),a("div",null,n)}const g=s(e,[["render",l]]);export{F as __pageData,g as default};
diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.BNp7qade.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.LG1pIdT8.js"
similarity index 98%
rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.BNp7qade.js"
rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.LG1pIdT8.js"
index 3771d58..2b94be6 100644
--- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.BNp7qade.js"
+++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.LG1pIdT8.js"
@@ -1,4 +1,4 @@
-import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"动态等待","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/动态等待.md","filePath":"指南/与生俱来/动态等待.md","lastUpdated":1721405890000}'),n={name:"指南/与生俱来/动态等待.md"},e=t(`

动态等待

架构动态等待

python
from youqu3 import sleep
+import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"动态等待","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/动态等待.md","filePath":"指南/与生俱来/动态等待.md","lastUpdated":1721408535000}'),n={name:"指南/与生俱来/动态等待.md"},e=t(`

动态等待

架构动态等待

python
from youqu3 import sleep
 
 sleep(1)

可以完全代替之前这样的写法:

python
from time import sleep

优化:

  • 增加了等待的日志

  • 根据不同的架构对等待时间进行倍数放大,各架构倍数:

    ini
    x86_64 = 1
     aarch64 = 1.5
    diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.BNp7qade.lean.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.LG1pIdT8.lean.js"
    similarity index 86%
    rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.BNp7qade.lean.js"
    rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.LG1pIdT8.lean.js"
    index 1f0829c..3308310 100644
    --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.BNp7qade.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.LG1pIdT8.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"动态等待","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/动态等待.md","filePath":"指南/与生俱来/动态等待.md","lastUpdated":1721405890000}'),n={name:"指南/与生俱来/动态等待.md"},e=t("",8),p=[e];function l(h,k,r,d,o,c){return i(),a("div",null,p)}const _=s(n,[["render",l]]);export{g as __pageData,_ as default};
    +import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"动态等待","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/动态等待.md","filePath":"指南/与生俱来/动态等待.md","lastUpdated":1721408535000}'),n={name:"指南/与生俱来/动态等待.md"},e=t("",8),p=[e];function l(h,k,r,d,o,c){return i(),a("div",null,p)}const _=s(n,[["render",l]]);export{g as __pageData,_ as default};
    diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.BOp46UVp.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.7SDsZBAk.js"
    similarity index 99%
    rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.BOp46UVp.js"
    rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.7SDsZBAk.js"
    index 0ab2fcc..edf1ad0 100644
    --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.BOp46UVp.js"
    +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.7SDsZBAk.js"
    @@ -1,4 +1,4 @@
    -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"命令行交互","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/命令行交互.md","filePath":"指南/与生俱来/命令行交互.md","lastUpdated":1721405890000}'),n={name:"指南/与生俱来/命令行交互.md"},h=t(`

    命令行交互

    本机命令行交互

    普通权限执行

    python
    from youqu3.cmd import Cmd
    +import{_ as s,c as i,o as a,U as t}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"命令行交互","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/命令行交互.md","filePath":"指南/与生俱来/命令行交互.md","lastUpdated":1721408535000}'),n={name:"指南/与生俱来/命令行交互.md"},h=t(`

    命令行交互

    本机命令行交互

    普通权限执行

    python
    from youqu3.cmd import Cmd
     
     Cmd.run("ls")

    sudo权限执行

    python
    from youqu3.cmd import Cmd
     
    diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.BOp46UVp.lean.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.7SDsZBAk.lean.js"
    similarity index 86%
    rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.BOp46UVp.lean.js"
    rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.7SDsZBAk.lean.js"
    index f5f5889..d831a30 100644
    --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.BOp46UVp.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.7SDsZBAk.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"命令行交互","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/命令行交互.md","filePath":"指南/与生俱来/命令行交互.md","lastUpdated":1721405890000}'),n={name:"指南/与生俱来/命令行交互.md"},h=t("",15),e=[h];function p(l,k,o,d,r,E){return a(),i("div",null,e)}const g=s(n,[["render",p]]);export{u as __pageData,g as default};
    +import{_ as s,c as i,o as a,U as t}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"命令行交互","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/命令行交互.md","filePath":"指南/与生俱来/命令行交互.md","lastUpdated":1721408535000}'),n={name:"指南/与生俱来/命令行交互.md"},h=t("",15),e=[h];function p(l,k,o,d,r,E){return a(),i("div",null,e)}const g=s(n,[["render",p]]);export{u as __pageData,g as default};
    diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.C_upRVFp.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.DYZkvVDK.js"
    similarity index 99%
    rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.C_upRVFp.js"
    rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.DYZkvVDK.js"
    index d1bc633..b0c5c44 100644
    --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.C_upRVFp.js"
    +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.DYZkvVDK.js"
    @@ -1,4 +1,4 @@
    -import{_ as s,c as i,o as a,U as n,a6 as h}from"./chunks/framework.CoRJFuj9.js";const C=JSON.parse('{"title":"断言语句","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/断言语句.md","filePath":"指南/与生俱来/断言语句.md","lastUpdated":1721405890000}'),k={name:"指南/与生俱来/断言语句.md"},p=n('

    断言语句

    YouQu3 自带多种断言语句,几乎满足了所有的断言场景;

    用例中使用方法

    APP 工程自有断言模块:assert_method.py,它继承了 YouQu3 框架的断言库:

    python
    # assert_method.py
    +import{_ as s,c as i,o as a,U as n,a6 as h}from"./chunks/framework.CoRJFuj9.js";const C=JSON.parse('{"title":"断言语句","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/断言语句.md","filePath":"指南/与生俱来/断言语句.md","lastUpdated":1721408535000}'),k={name:"指南/与生俱来/断言语句.md"},p=n('

    断言语句

    YouQu3 自带多种断言语句,几乎满足了所有的断言场景;

    用例中使用方法

    APP 工程自有断言模块:assert_method.py,它继承了 YouQu3 框架的断言库:

    python
    # assert_method.py
     
     from youqu3.assertx import Assert
     
    diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.C_upRVFp.lean.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.DYZkvVDK.lean.js"
    similarity index 86%
    rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.C_upRVFp.lean.js"
    rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.DYZkvVDK.lean.js"
    index 6c8d364..0205b4b 100644
    --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.C_upRVFp.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.DYZkvVDK.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as n,a6 as h}from"./chunks/framework.CoRJFuj9.js";const C=JSON.parse('{"title":"断言语句","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/断言语句.md","filePath":"指南/与生俱来/断言语句.md","lastUpdated":1721405890000}'),k={name:"指南/与生俱来/断言语句.md"},p=n("",12),l=[p];function t(e,E,r,F,d,g){return a(),i("div",null,l)}const o=s(k,[["render",t]]);export{C as __pageData,o as default};
    +import{_ as s,c as i,o as a,U as n,a6 as h}from"./chunks/framework.CoRJFuj9.js";const C=JSON.parse('{"title":"断言语句","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/断言语句.md","filePath":"指南/与生俱来/断言语句.md","lastUpdated":1721408535000}'),k={name:"指南/与生俱来/断言语句.md"},p=n("",12),l=[p];function t(e,E,r,F,d,g){return a(),i("div",null,l)}const o=s(k,[["render",t]]);export{C as __pageData,o as default};
    diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.D6Anahcv.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DOd8Dpk9.js"
    similarity index 99%
    rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.D6Anahcv.js"
    rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DOd8Dpk9.js"
    index 67755ef..3acb556 100644
    --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.D6Anahcv.js"
    +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DOd8Dpk9.js"
    @@ -1 +1 @@
    -import{_ as t,c as e,o as d,U as a}from"./chunks/framework.CoRJFuj9.js";const b=JSON.parse('{"title":"标签化管理","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/标签化管理.md","filePath":"指南/与生俱来/标签化管理.md","lastUpdated":1721405890000}'),c={name:"指南/与生俱来/标签化管理.md"},o=a('

    标签化管理

    使用说明

    在 CSV 文件中写入标签:

    脚本文件ID跳过原因确认修复废弃用例...
    001skip-xxxfixed-xxxremoved-xxx...

    CSV文件与脚本对应关系

    1. 在子项目目录下新建 CSV文件,用于保存用例标签,以 用例脚本的 py 文件去掉首字符串 "test_" ,去掉用例序号后的字符串,取中间的名称作为 csv 文件的文件名 。

    举例

    相册的用例文件为 test_album_001.py001 表示用例的ID(也可以是自定义的数字代表用例序号),此时 CSV 文件名就应为 album.csv

    1. 第 1 列脚本文件ID,从第 2 列之后的所有列都是一个用例标签,标签可以无序,可以随意新增。

    特殊标签

    跳过原因确认修复废弃用例是特殊的标签,后面会详细讲到

    对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 CSV 文件,所有 CSV 文件建议放在一个 tags 目录下。

    是否分模块维护取决于应用的用例复杂度,但标签化管理的核心目的是集中化管理用例的标签,因此若 CSV 文件太多了也是一个很糟糕的事情。

    跳过用例

    传统跳过用例的方式是在用例脚本里面给用例添加装饰器 (@pytest.mark.skip),解除跳过时将装饰器代码删掉,这种方式需要修改用例代码,而通过 csv 文件来管理跳过用例则会方便很多;

    将跳过用例操作也整合进入用例标签,在 csv 文件中新增一列为“跳过原因”;

    1. 固定跳过

    示例:

    脚本文件ID...(各种用例标签)跳过原因
    679537...skip-受到某新需求影响
    • 如果应用受到新需求影响需要跳过,则在此列备注具体的跳过原因。跳过的原因统一标签开头为 “skip-XXX”;
    • 用例执行时判断 csv 文件里面跳过原因列是否存在跳过标签,存在跳过标签则用例也不会被执行,最终的用例状态会被标签为 SKIPED

    2. 条件判断跳过

    CSV 文件中,跳过原因一栏中填写为 “{函数名}-{参数}”。

    某些用例会因为不同的环境判断用例是否执行,常见的场景为在不同架构上判断是否执行,例如:skipif_platform-aarch64

    示例:

    脚本文件ID...(各种用例标签)跳过原因
    001...skipif_platform-aarch64&sw64
    • 跳过的原因标签为 “skipif_platform-” + 架构名,多个架构之间使用 “&” 拼接;
    • 判断当前架构是否为 arrch64 或者 sw64,若是,则跳过用例不执行;

    内置支持的条件跳过对象:

    跳过对象参数说明
    skipif_platform(x86_64aarch64loogarch64sw64)架构跳过
    skipif_not_platform(x86_64aarch64loogarch64sw64)架构不跳过
    skipif_xdg_type(waylandx11)系统显示协议跳过
    skipif_cpu_name/使用 sudo dmidecode -s system-product-name 查看机器的 cpu 型号 剔除中横线和 & 符号,
    比如:KLVV-W5821,标签记录为 KLVVW5821
    skipif_not_cpu_name/和上面逻辑相反

    3.自定义跳过

    在用例工程根目录下存放 skipif.py,自定义条件判断跳过的函数写在此文件中。

    方法编写规范:

    • 方法名必须以 skipif 开头;
    • 方法必须有返回结果并且为布尔值(True 代表跳过,False 代表不跳过);
    • 方法只能有一个入参;

    在用例收集阶段会以第一个 “-” 进行分割,截取的左侧字符串作为函数名,在 skipif.py 文件中查找是否有同名函数,并将截取的右侧作为参数传递给该函数,通过获取该函数返回的布尔值,返回 True,则用例不执行,返回 False,则执行该用例。

    重要

    • 若函数需要多个参数,可自定义多个参数之间的连接符,连接符号不可使用下划线和逗号,推荐统一使用 & 符号;

    • 若需要多个 skipif 条件判断组合,使用 && 符号将两个方法分开,比如:skipif_platform-aarch64&&skipif_xdg_type-wayland

    确认修复

    针对于某些用例修复后,但不能立即删除跳过原因(skip-XXX)的用例,新增一列标签名为 “确认修复”,作为标记该用例是否已经修复,固定填入字段为 “fixed-已修复”。这样这条用例即使同时标记了 skip-XXX 也会正常执行。

    示例:

    用例ID...(各种用例标签)跳过原因确认修复
    679537...skip-受到某新需求影响fixed-已修复

    【同时标记了skipfixed,但仍然想要跳过用例】

    当 “跳过原因” 和 “确认修复” 中同时填入后,命令行传递参数 --ifixed yes,则代码不会执行该条用例。

    bash
    python3 manage.py run --ifixed yes

    废弃用例

    针对某些用例,由于需求变更,环境影响或评估不再适用于自动化测试时,用例需要废弃,则新增一列标签名为 “废弃用例”,该列存在 “removed-{废弃原因}”,则用例不会执行。

    用例ID...(各种用例标签)跳过原因确认修复废弃用例
    679537...skip-受到某新需求影响fixed-已修复removed-已废弃

    文件格式

    此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。

    ',45),l=[o];function i(s,r,n,h,p,x){return d(),e("div",null,l)}const k=t(c,[["render",i]]);export{b as __pageData,k as default}; +import{_ as t,c as e,o as d,U as a}from"./chunks/framework.CoRJFuj9.js";const b=JSON.parse('{"title":"标签化管理","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/标签化管理.md","filePath":"指南/与生俱来/标签化管理.md","lastUpdated":1721408535000}'),c={name:"指南/与生俱来/标签化管理.md"},o=a('

    标签化管理

    使用说明

    在 CSV 文件中写入标签:

    脚本文件ID跳过原因确认修复废弃用例...
    001skip-xxxfixed-xxxremoved-xxx...

    CSV文件与脚本对应关系

    1. 在子项目目录下新建 CSV文件,用于保存用例标签,以 用例脚本的 py 文件去掉首字符串 "test_" ,去掉用例序号后的字符串,取中间的名称作为 csv 文件的文件名 。

    举例

    相册的用例文件为 test_album_001.py001 表示用例的ID(也可以是自定义的数字代表用例序号),此时 CSV 文件名就应为 album.csv

    1. 第 1 列脚本文件ID,从第 2 列之后的所有列都是一个用例标签,标签可以无序,可以随意新增。

    特殊标签

    跳过原因确认修复废弃用例是特殊的标签,后面会详细讲到

    对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 CSV 文件,所有 CSV 文件建议放在一个 tags 目录下。

    是否分模块维护取决于应用的用例复杂度,但标签化管理的核心目的是集中化管理用例的标签,因此若 CSV 文件太多了也是一个很糟糕的事情。

    跳过用例

    传统跳过用例的方式是在用例脚本里面给用例添加装饰器 (@pytest.mark.skip),解除跳过时将装饰器代码删掉,这种方式需要修改用例代码,而通过 csv 文件来管理跳过用例则会方便很多;

    将跳过用例操作也整合进入用例标签,在 csv 文件中新增一列为“跳过原因”;

    1. 固定跳过

    示例:

    脚本文件ID...(各种用例标签)跳过原因
    679537...skip-受到某新需求影响
    • 如果应用受到新需求影响需要跳过,则在此列备注具体的跳过原因。跳过的原因统一标签开头为 “skip-XXX”;
    • 用例执行时判断 csv 文件里面跳过原因列是否存在跳过标签,存在跳过标签则用例也不会被执行,最终的用例状态会被标签为 SKIPED

    2. 条件判断跳过

    CSV 文件中,跳过原因一栏中填写为 “{函数名}-{参数}”。

    某些用例会因为不同的环境判断用例是否执行,常见的场景为在不同架构上判断是否执行,例如:skipif_platform-aarch64

    示例:

    脚本文件ID...(各种用例标签)跳过原因
    001...skipif_platform-aarch64&sw64
    • 跳过的原因标签为 “skipif_platform-” + 架构名,多个架构之间使用 “&” 拼接;
    • 判断当前架构是否为 arrch64 或者 sw64,若是,则跳过用例不执行;

    内置支持的条件跳过对象:

    跳过对象参数说明
    skipif_platform(x86_64aarch64loogarch64sw64)架构跳过
    skipif_not_platform(x86_64aarch64loogarch64sw64)架构不跳过
    skipif_xdg_type(waylandx11)系统显示协议跳过
    skipif_cpu_name/使用 sudo dmidecode -s system-product-name 查看机器的 cpu 型号 剔除中横线和 & 符号,
    比如:KLVV-W5821,标签记录为 KLVVW5821
    skipif_not_cpu_name/和上面逻辑相反

    3.自定义跳过

    在用例工程根目录下存放 skipif.py,自定义条件判断跳过的函数写在此文件中。

    方法编写规范:

    • 方法名必须以 skipif 开头;
    • 方法必须有返回结果并且为布尔值(True 代表跳过,False 代表不跳过);
    • 方法只能有一个入参;

    在用例收集阶段会以第一个 “-” 进行分割,截取的左侧字符串作为函数名,在 skipif.py 文件中查找是否有同名函数,并将截取的右侧作为参数传递给该函数,通过获取该函数返回的布尔值,返回 True,则用例不执行,返回 False,则执行该用例。

    重要

    • 若函数需要多个参数,可自定义多个参数之间的连接符,连接符号不可使用下划线和逗号,推荐统一使用 & 符号;

    • 若需要多个 skipif 条件判断组合,使用 && 符号将两个方法分开,比如:skipif_platform-aarch64&&skipif_xdg_type-wayland

    确认修复

    针对于某些用例修复后,但不能立即删除跳过原因(skip-XXX)的用例,新增一列标签名为 “确认修复”,作为标记该用例是否已经修复,固定填入字段为 “fixed-已修复”。这样这条用例即使同时标记了 skip-XXX 也会正常执行。

    示例:

    用例ID...(各种用例标签)跳过原因确认修复
    679537...skip-受到某新需求影响fixed-已修复

    【同时标记了skipfixed,但仍然想要跳过用例】

    当 “跳过原因” 和 “确认修复” 中同时填入后,命令行传递参数 --ifixed yes,则代码不会执行该条用例。

    bash
    python3 manage.py run --ifixed yes

    废弃用例

    针对某些用例,由于需求变更,环境影响或评估不再适用于自动化测试时,用例需要废弃,则新增一列标签名为 “废弃用例”,该列存在 “removed-{废弃原因}”,则用例不会执行。

    用例ID...(各种用例标签)跳过原因确认修复废弃用例
    679537...skip-受到某新需求影响fixed-已修复removed-已废弃

    文件格式

    此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。

    ',45),l=[o];function i(s,r,n,h,p,x){return d(),e("div",null,l)}const k=t(c,[["render",i]]);export{b as __pageData,k as default}; diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.D6Anahcv.lean.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DOd8Dpk9.lean.js" similarity index 86% rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.D6Anahcv.lean.js" rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DOd8Dpk9.lean.js" index 3b4531d..ae791f2 100644 --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.D6Anahcv.lean.js" +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DOd8Dpk9.lean.js" @@ -1 +1 @@ -import{_ as t,c as e,o as d,U as a}from"./chunks/framework.CoRJFuj9.js";const b=JSON.parse('{"title":"标签化管理","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/标签化管理.md","filePath":"指南/与生俱来/标签化管理.md","lastUpdated":1721405890000}'),c={name:"指南/与生俱来/标签化管理.md"},o=a("",45),l=[o];function i(s,r,n,h,p,x){return d(),e("div",null,l)}const k=t(c,[["render",i]]);export{b as __pageData,k as default}; +import{_ as t,c as e,o as d,U as a}from"./chunks/framework.CoRJFuj9.js";const b=JSON.parse('{"title":"标签化管理","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/标签化管理.md","filePath":"指南/与生俱来/标签化管理.md","lastUpdated":1721408535000}'),c={name:"指南/与生俱来/标签化管理.md"},o=a("",45),l=[o];function i(s,r,n,h,p,x){return d(),e("div",null,l)}const k=t(c,[["render",i]]);export{b as __pageData,k as default}; diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.CIadOZoE.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.DRa5p1HS.js" similarity index 85% rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.CIadOZoE.js" rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.DRa5p1HS.js" index 09c2114..e2702ec 100644 --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.CIadOZoE.js" +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.DRa5p1HS.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/脚手架工具.md","filePath":"指南/与生俱来/脚手架工具.md","lastUpdated":1721405890000}'),r={name:"指南/与生俱来/脚手架工具.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/脚手架工具.md","filePath":"指南/与生俱来/脚手架工具.md","lastUpdated":1721408535000}'),r={name:"指南/与生俱来/脚手架工具.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.CIadOZoE.lean.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.DRa5p1HS.lean.js" similarity index 85% rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.CIadOZoE.lean.js" rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.DRa5p1HS.lean.js" index 09c2114..e2702ec 100644 --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.CIadOZoE.lean.js" +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.DRa5p1HS.lean.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/脚手架工具.md","filePath":"指南/与生俱来/脚手架工具.md","lastUpdated":1721405890000}'),r={name:"指南/与生俱来/脚手架工具.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/脚手架工具.md","filePath":"指南/与生俱来/脚手架工具.md","lastUpdated":1721408535000}'),r={name:"指南/与生俱来/脚手架工具.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BuYkSeI0.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.TCPCQR_v.js" similarity index 99% rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BuYkSeI0.js" rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.TCPCQR_v.js" index 0da8948..ab99d5e 100644 --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BuYkSeI0.js" +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.TCPCQR_v.js" @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n,a7 as p}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"远程交互式控制","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/远程交互控制.md","filePath":"指南/与生俱来/远程交互控制.md","lastUpdated":1721405890000}'),t={name:"指南/与生俱来/远程交互控制.md"},h=n('

    远程交互式控制

    在用例执行过程中控制远程机器执行复杂的 UI 操作或命令行操作。

    在远程测试机上部署一个完整的 YouQu3 环境以提供 UI 交互的基础能力,然后将这些基础能力通过 RPC 服务的方式提供出来,在服务端通过调用 RPC 接口从而控制远程机器执行用例步骤。

    slaves对象提供远程机器信息

    slaves 是 YouQu 提供的一个全局对象,它保存了远程测试机的信息列表;

    机器信息有 2 种方式传入:

    命令行

    bash
    youqu3 run --slaves root@192.168.1.1:password1

    多个机器信息用 / 分割:

    bash
    ... --slaves root@192.168.1.1:password1/root@192.168.1.2:password2

    UI操作远程对象

    RpcGui

    用于属性定位相关操作;

    python
    # remote_widget.py
    +import{_ as s,c as i,o as a,U as n,a7 as p}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"远程交互式控制","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/远程交互控制.md","filePath":"指南/与生俱来/远程交互控制.md","lastUpdated":1721408535000}'),t={name:"指南/与生俱来/远程交互控制.md"},h=n('

    远程交互式控制

    在用例执行过程中控制远程机器执行复杂的 UI 操作或命令行操作。

    在远程测试机上部署一个完整的 YouQu3 环境以提供 UI 交互的基础能力,然后将这些基础能力通过 RPC 服务的方式提供出来,在服务端通过调用 RPC 接口从而控制远程机器执行用例步骤。

    slaves对象提供远程机器信息

    slaves 是 YouQu 提供的一个全局对象,它保存了远程测试机的信息列表;

    机器信息有 2 种方式传入:

    命令行

    bash
    youqu3 run --slaves root@192.168.1.1:password1

    多个机器信息用 / 分割:

    bash
    ... --slaves root@192.168.1.1:password1/root@192.168.1.2:password2

    UI操作远程对象

    RpcGui

    用于属性定位相关操作;

    python
    # remote_widget.py
     
     from youqu3.gui import RpcGui
     
    diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BuYkSeI0.lean.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.TCPCQR_v.lean.js"
    similarity index 87%
    rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BuYkSeI0.lean.js"
    rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.TCPCQR_v.lean.js"
    index 4858ffd..0d1b5e9 100644
    --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BuYkSeI0.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.TCPCQR_v.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as n,a7 as p}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"远程交互式控制","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/远程交互控制.md","filePath":"指南/与生俱来/远程交互控制.md","lastUpdated":1721405890000}'),t={name:"指南/与生俱来/远程交互控制.md"},h=n("",15),l=[h];function e(k,r,d,o,E,g){return a(),i("div",null,l)}const F=s(t,[["render",e]]);export{y as __pageData,F as default};
    +import{_ as s,c as i,o as a,U as n,a7 as p}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"远程交互式控制","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/远程交互控制.md","filePath":"指南/与生俱来/远程交互控制.md","lastUpdated":1721408535000}'),t={name:"指南/与生俱来/远程交互控制.md"},h=n("",15),l=[h];function e(k,r,d,o,E,g){return a(),i("div",null,l)}const F=s(t,[["render",e]]);export{y as __pageData,F as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.8Q1TXL_h.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.DAQ6P4eN.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.8Q1TXL_h.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.DAQ6P4eN.js"
    index 88f736b..12e2e35 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.8Q1TXL_h.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.DAQ6P4eN.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/DBus自动化.md","filePath":"指南/可选功能/DBus自动化.md","lastUpdated":1721405890000}'),s={name:"指南/可选功能/DBus自动化.md"};function r(o,c,n,_,d,p){return a(),t("div")}const f=e(s,[["render",r]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/DBus自动化.md","filePath":"指南/可选功能/DBus自动化.md","lastUpdated":1721408535000}'),s={name:"指南/可选功能/DBus自动化.md"};function r(o,c,n,_,d,p){return a(),t("div")}const f=e(s,[["render",r]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.8Q1TXL_h.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.DAQ6P4eN.lean.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.8Q1TXL_h.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.DAQ6P4eN.lean.js"
    index 88f736b..12e2e35 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.8Q1TXL_h.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.DAQ6P4eN.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/DBus自动化.md","filePath":"指南/可选功能/DBus自动化.md","lastUpdated":1721405890000}'),s={name:"指南/可选功能/DBus自动化.md"};function r(o,c,n,_,d,p){return a(),t("div")}const f=e(s,[["render",r]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/DBus自动化.md","filePath":"指南/可选功能/DBus自动化.md","lastUpdated":1721408535000}'),s={name:"指南/可选功能/DBus自动化.md"};function r(o,c,n,_,d,p){return a(),t("div")}const f=e(s,[["render",r]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.BYBjR3nB.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.CEakJzU1.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.BYBjR3nB.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.CEakJzU1.js"
    index 271617b..8e7efe1 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.BYBjR3nB.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.CEakJzU1.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/GUI自动化.md","filePath":"指南/可选功能/GUI自动化.md","lastUpdated":1721405890000}'),r={name:"指南/可选功能/GUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/GUI自动化.md","filePath":"指南/可选功能/GUI自动化.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/GUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.BYBjR3nB.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.CEakJzU1.lean.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.BYBjR3nB.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.CEakJzU1.lean.js"
    index 271617b..8e7efe1 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.BYBjR3nB.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.CEakJzU1.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/GUI自动化.md","filePath":"指南/可选功能/GUI自动化.md","lastUpdated":1721405890000}'),r={name:"指南/可选功能/GUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/GUI自动化.md","filePath":"指南/可选功能/GUI自动化.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/GUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.CH2tkTA8.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.BD0C2PLp.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.CH2tkTA8.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.BD0C2PLp.js"
    index 9854143..745bfce 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.CH2tkTA8.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.BD0C2PLp.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTML报告.md","filePath":"指南/可选功能/HTML报告.md","lastUpdated":1721405890000}'),r={name:"指南/可选功能/HTML报告.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTML报告.md","filePath":"指南/可选功能/HTML报告.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/HTML报告.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.CH2tkTA8.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.BD0C2PLp.lean.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.CH2tkTA8.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.BD0C2PLp.lean.js"
    index 9854143..745bfce 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.CH2tkTA8.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.BD0C2PLp.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTML报告.md","filePath":"指南/可选功能/HTML报告.md","lastUpdated":1721405890000}'),r={name:"指南/可选功能/HTML报告.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTML报告.md","filePath":"指南/可选功能/HTML报告.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/HTML报告.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.Cgbfk7sY.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.ClcvJbXP.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.Cgbfk7sY.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.ClcvJbXP.js"
    index 0b3dd3e..44f0258 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.Cgbfk7sY.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.ClcvJbXP.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTTP自动化.md","filePath":"指南/可选功能/HTTP自动化.md","lastUpdated":1721405890000}'),r={name:"指南/可选功能/HTTP自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTTP自动化.md","filePath":"指南/可选功能/HTTP自动化.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/HTTP自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.Cgbfk7sY.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.ClcvJbXP.lean.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.Cgbfk7sY.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.ClcvJbXP.lean.js"
    index 0b3dd3e..44f0258 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.Cgbfk7sY.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.ClcvJbXP.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTTP自动化.md","filePath":"指南/可选功能/HTTP自动化.md","lastUpdated":1721405890000}'),r={name:"指南/可选功能/HTTP自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTTP自动化.md","filePath":"指南/可选功能/HTTP自动化.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/HTTP自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.B8SgVh3z.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.4tGdED5Q.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.B8SgVh3z.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.4tGdED5Q.js"
    index afadec4..504bd02 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.B8SgVh3z.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.4tGdED5Q.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/WebUI自动化.md","filePath":"指南/可选功能/WebUI自动化.md","lastUpdated":1721405890000}'),r={name:"指南/可选功能/WebUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/WebUI自动化.md","filePath":"指南/可选功能/WebUI自动化.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/WebUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.B8SgVh3z.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.4tGdED5Q.lean.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.B8SgVh3z.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.4tGdED5Q.lean.js"
    index afadec4..504bd02 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.B8SgVh3z.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.4tGdED5Q.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/WebUI自动化.md","filePath":"指南/可选功能/WebUI自动化.md","lastUpdated":1721405890000}'),r={name:"指南/可选功能/WebUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/WebUI自动化.md","filePath":"指南/可选功能/WebUI自动化.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/WebUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.DukfktyF.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.UhOPKbmA.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.DukfktyF.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.UhOPKbmA.js"
    index 8e5a164..e5f04df 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.DukfktyF.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.UhOPKbmA.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/其他插件.md","filePath":"指南/可选功能/其他插件.md","lastUpdated":1721405890000}'),r={name:"指南/可选功能/其他插件.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/其他插件.md","filePath":"指南/可选功能/其他插件.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/其他插件.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.DukfktyF.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.UhOPKbmA.lean.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.DukfktyF.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.UhOPKbmA.lean.js"
    index 8e5a164..e5f04df 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.DukfktyF.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.UhOPKbmA.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/其他插件.md","filePath":"指南/可选功能/其他插件.md","lastUpdated":1721405890000}'),r={name:"指南/可选功能/其他插件.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/其他插件.md","filePath":"指南/可选功能/其他插件.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/其他插件.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.qfjldP8y.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.DggQ5HdS.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.qfjldP8y.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.DggQ5HdS.js"
    index 2b6657a..eaa5cfc 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.qfjldP8y.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.DggQ5HdS.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/用例录屏.md","filePath":"指南/可选功能/用例录屏.md","lastUpdated":1721405890000}'),r={name:"指南/可选功能/用例录屏.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/用例录屏.md","filePath":"指南/可选功能/用例录屏.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/用例录屏.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.qfjldP8y.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.DggQ5HdS.lean.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.qfjldP8y.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.DggQ5HdS.lean.js"
    index 2b6657a..eaa5cfc 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.qfjldP8y.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.DggQ5HdS.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/用例录屏.md","filePath":"指南/可选功能/用例录屏.md","lastUpdated":1721405890000}'),r={name:"指南/可选功能/用例录屏.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/用例录屏.md","filePath":"指南/可选功能/用例录屏.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/用例录屏.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.D7Ub616Q.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BJD86lKm.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.D7Ub616Q.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BJD86lKm.js"
    index 8c29826..15ffca4 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.D7Ub616Q.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BJD86lKm.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/远程交互控制.md","filePath":"指南/可选功能/远程交互控制.md","lastUpdated":1721405890000}'),r={name:"指南/可选功能/远程交互控制.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/远程交互控制.md","filePath":"指南/可选功能/远程交互控制.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/远程交互控制.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.D7Ub616Q.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BJD86lKm.lean.js"
    similarity index 85%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.D7Ub616Q.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BJD86lKm.lean.js"
    index 8c29826..15ffca4 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.D7Ub616Q.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BJD86lKm.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/远程交互控制.md","filePath":"指南/可选功能/远程交互控制.md","lastUpdated":1721405890000}'),r={name:"指南/可选功能/远程交互控制.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/远程交互控制.md","filePath":"指南/可选功能/远程交互控制.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/远程交互控制.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.NUJbTvDe.js" "b/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DxExLQbF.js"
    similarity index 95%
    rename from "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.NUJbTvDe.js"
    rename to "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DxExLQbF.js"
    index c8e5529..293a9d5 100644
    --- "a/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.NUJbTvDe.js"
    +++ "b/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DxExLQbF.js"
    @@ -1 +1 @@
    -import{_ as s,c as a,o as e,U as t}from"./chunks/framework.CoRJFuj9.js";const k=JSON.parse('{"title":"原生环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/原生环境.md","filePath":"指南/环境管理/原生环境.md","lastUpdated":1721405890000}'),i={name:"指南/环境管理/原生环境.md"},n=t('

    原生环境

    当系统中安装了 YouQu3 之后,会自动生成一个命令:youqu3

    bash
    youqu3 -h

    你可以使用它进行用例的驱动执行和管理。

    比如:

    bash
    youqu3 run
    ',6),o=[n];function p(h,l,c,d,r,_){return e(),a("div",null,o)}const g=s(i,[["render",p]]);export{k as __pageData,g as default}; +import{_ as s,c as a,o as e,U as t}from"./chunks/framework.CoRJFuj9.js";const k=JSON.parse('{"title":"原生环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/原生环境.md","filePath":"指南/环境管理/原生环境.md","lastUpdated":1721408535000}'),i={name:"指南/环境管理/原生环境.md"},n=t('

    原生环境

    当系统中安装了 YouQu3 之后,会自动生成一个命令:youqu3

    bash
    youqu3 -h

    你可以使用它进行用例的驱动执行和管理。

    比如:

    bash
    youqu3 run
    ',6),o=[n];function p(h,l,c,d,r,_){return e(),a("div",null,o)}const g=s(i,[["render",p]]);export{k as __pageData,g as default}; diff --git "a/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.NUJbTvDe.lean.js" "b/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DxExLQbF.lean.js" similarity index 86% rename from "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.NUJbTvDe.lean.js" rename to "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DxExLQbF.lean.js" index 150f17a..e78ad69 100644 --- "a/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.NUJbTvDe.lean.js" +++ "b/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DxExLQbF.lean.js" @@ -1 +1 @@ -import{_ as s,c as a,o as e,U as t}from"./chunks/framework.CoRJFuj9.js";const k=JSON.parse('{"title":"原生环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/原生环境.md","filePath":"指南/环境管理/原生环境.md","lastUpdated":1721405890000}'),i={name:"指南/环境管理/原生环境.md"},n=t("",6),o=[n];function p(h,l,c,d,r,_){return e(),a("div",null,o)}const g=s(i,[["render",p]]);export{k as __pageData,g as default}; +import{_ as s,c as a,o as e,U as t}from"./chunks/framework.CoRJFuj9.js";const k=JSON.parse('{"title":"原生环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/原生环境.md","filePath":"指南/环境管理/原生环境.md","lastUpdated":1721408535000}'),i={name:"指南/环境管理/原生环境.md"},n=t("",6),o=[n];function p(h,l,c,d,r,_){return e(),a("div",null,o)}const g=s(i,[["render",p]]);export{k as __pageData,g as default}; diff --git "a/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.BM0wRiFv.js" "b/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.CYH44Dje.js" similarity index 98% rename from "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.BM0wRiFv.js" rename to "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.CYH44Dje.js" index b1278d7..26d1c33 100644 --- "a/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.BM0wRiFv.js" +++ "b/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.CYH44Dje.js" @@ -1,2 +1,2 @@ -import{_ as a,c as s,o as e,U as t}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"虚拟环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/虚拟环境.md","filePath":"指南/环境管理/虚拟环境.md","lastUpdated":1721405890000}'),o={name:"指南/环境管理/虚拟环境.md"},i=t(`

    虚拟环境

    当系统中安装了 YouQu3 之后,会自动生成一个命令:youqu3

    这个命令可以在系统原生环境中使用,它除了可以驱动用例执行,还可以进行环境的管理:

    bash
    youqu3 envx

    子命令 envx 用于虚拟环境安装,执行之后会自动创建一些有用的命令:

    命令说明
    youqu3-cargo用例执行驱动的命令
    youqu3-shell激活虚拟环境
    youqu3-rm删除虚拟环境

    youqu3-cargo

    youqu3-cargo 可以自动加载虚拟环境并驱动用例工程:

    bash
    youqu3-cargo run

    youqu3-shell

    youqu3-shell 可以激活虚拟环境,由于虚拟环境中也安装了 YouQu3 ,因此你仍然可以在虚拟环境中使用命令:youqu3

    bash
    $ youqu3-shell
    +import{_ as a,c as s,o as e,U as t}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"虚拟环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/虚拟环境.md","filePath":"指南/环境管理/虚拟环境.md","lastUpdated":1721408535000}'),o={name:"指南/环境管理/虚拟环境.md"},i=t(`

    虚拟环境

    当系统中安装了 YouQu3 之后,会自动生成一个命令:youqu3

    这个命令可以在系统原生环境中使用,它除了可以驱动用例执行,还可以进行环境的管理:

    bash
    youqu3 envx

    子命令 envx 用于虚拟环境安装,执行之后会自动创建一些有用的命令:

    命令说明
    youqu3-cargo用例执行驱动的命令
    youqu3-shell激活虚拟环境
    youqu3-rm删除虚拟环境

    youqu3-cargo

    youqu3-cargo 可以自动加载虚拟环境并驱动用例工程:

    bash
    youqu3-cargo run

    youqu3-shell

    youqu3-shell 可以激活虚拟环境,由于虚拟环境中也安装了 YouQu3 ,因此你仍然可以在虚拟环境中使用命令:youqu3

    bash
    $ youqu3-shell
     (my_virtualenv)$ youqu3 run

    youqu3-rm

    youqu3-rm 命令可以将当前的虚拟环境删除。

    `,14),d=[i];function h(l,n,u,r,c,p){return e(),s("div",null,d)}const g=a(o,[["render",h]]);export{y as __pageData,g as default}; diff --git "a/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.BM0wRiFv.lean.js" "b/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.CYH44Dje.lean.js" similarity index 86% rename from "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.BM0wRiFv.lean.js" rename to "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.CYH44Dje.lean.js" index cbc172d..8e1b33c 100644 --- "a/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.BM0wRiFv.lean.js" +++ "b/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.CYH44Dje.lean.js" @@ -1 +1 @@ -import{_ as a,c as s,o as e,U as t}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"虚拟环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/虚拟环境.md","filePath":"指南/环境管理/虚拟环境.md","lastUpdated":1721405890000}'),o={name:"指南/环境管理/虚拟环境.md"},i=t("",14),d=[i];function h(l,n,u,r,c,p){return e(),s("div",null,d)}const g=a(o,[["render",h]]);export{y as __pageData,g as default}; +import{_ as a,c as s,o as e,U as t}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"虚拟环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/虚拟环境.md","filePath":"指南/环境管理/虚拟环境.md","lastUpdated":1721408535000}'),o={name:"指南/环境管理/虚拟环境.md"},i=t("",14),d=[i];function h(l,n,u,r,c,p){return e(),s("div",null,d)}const g=a(o,[["render",h]]);export{y as __pageData,g as default}; diff --git "a/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.SURc2hQV.js" "b/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.Bua1hpcO.js" similarity index 96% rename from "assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.SURc2hQV.js" rename to "assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.Bua1hpcO.js" index 59eda02..8cbfb6b 100644 --- "a/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.SURc2hQV.js" +++ "b/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.Bua1hpcO.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as o,a8 as u}from"./chunks/framework.CoRJFuj9.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{"outline":false},"headers":[],"relativePath":"指南/简介/YouQu3是什么.md","filePath":"指南/简介/YouQu3是什么.md","lastUpdated":1721405890000}'),i={name:"指南/简介/YouQu3是什么.md"},n=o('

    YouQu3

    YouQu3

    YouQu3, Next generation Linux automation testing framework.


    YouQu3 旨在成为下一代 Linux 自动化测试框架,在继承 YouQu2 诸多亮点功能的同时解决其遇到的问题,同时对各功能进行插件化、模块化改造,全面优化框架接口调用机制。

    • 以包的形式提供框架能力,方便安装、更新。
    • 支持离线部署,用例整体打包交付之后,可以在无网络环境下直接运行。
    • 极致轻量化、可定制化依赖,可以根据测试项目类型安装对应的依赖。
    • 功能可插拔,以插件的形式提供功能,不安装插件的情况下框架也能正常运行。
    • 可视化配置,在浏览器中输入一些配置后即可驱动测试用例执行,搭配远程执行功能,可实现群控测试机执行。
    • 支持非开发者下运行,简化系统环境部署。

    YouQu3 能做什么?

    ☑ 💻 Linux 桌面应用 UI 自动化测试

    ☑ 🌏 Web UI 自动化测试

    ☑ 🚌 Linux DBus 接口自动化测试

    ☑ 🚀 Linux 命令行自动化测试

    ☑ 🕷️ HTTP 接口自动化测试

    ☑ 🤙️ 。。。无限可能

    ',13),r=[n];function l(s,p,_,c,h,d){return a(),t("div",null,r)}const g=e(i,[["render",l]]);export{f as __pageData,g as default}; +import{_ as e,c as t,o as a,U as o,a8 as u}from"./chunks/framework.CoRJFuj9.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{"outline":false},"headers":[],"relativePath":"指南/简介/YouQu3是什么.md","filePath":"指南/简介/YouQu3是什么.md","lastUpdated":1721408535000}'),i={name:"指南/简介/YouQu3是什么.md"},n=o('

    YouQu3

    YouQu3

    YouQu3, Next generation Linux automation testing framework.


    YouQu3 旨在成为下一代 Linux 自动化测试框架,在继承 YouQu2 诸多亮点功能的同时解决其遇到的问题,同时对各功能进行插件化、模块化改造,全面优化框架接口调用机制。

    • 以包的形式提供框架能力,方便安装、更新。
    • 支持离线部署,用例整体打包交付之后,可以在无网络环境下直接运行。
    • 极致轻量化、可定制化依赖,可以根据测试项目类型安装对应的依赖。
    • 功能可插拔,以插件的形式提供功能,不安装插件的情况下框架也能正常运行。
    • 可视化配置,在浏览器中输入一些配置后即可驱动测试用例执行,搭配远程执行功能,可实现群控测试机执行。
    • 支持非开发者下运行,简化系统环境部署。

    YouQu3 能做什么?

    ☑ 💻 Linux 桌面应用 UI 自动化测试

    ☑ 🌏 Web UI 自动化测试

    ☑ 🚌 Linux DBus 接口自动化测试

    ☑ 🚀 Linux 命令行自动化测试

    ☑ 🕷️ HTTP 接口自动化测试

    ☑ 🤙️ 。。。无限可能

    ',13),r=[n];function l(s,p,_,c,h,d){return a(),t("div",null,r)}const g=e(i,[["render",l]]);export{f as __pageData,g as default}; diff --git "a/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.SURc2hQV.lean.js" "b/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.Bua1hpcO.lean.js" similarity index 86% rename from "assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.SURc2hQV.lean.js" rename to "assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.Bua1hpcO.lean.js" index 06d6fa5..f29fb5e 100644 --- "a/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.SURc2hQV.lean.js" +++ "b/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.Bua1hpcO.lean.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as o,a8 as u}from"./chunks/framework.CoRJFuj9.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{"outline":false},"headers":[],"relativePath":"指南/简介/YouQu3是什么.md","filePath":"指南/简介/YouQu3是什么.md","lastUpdated":1721405890000}'),i={name:"指南/简介/YouQu3是什么.md"},n=o("",13),r=[n];function l(s,p,_,c,h,d){return a(),t("div",null,r)}const g=e(i,[["render",l]]);export{f as __pageData,g as default}; +import{_ as e,c as t,o as a,U as o,a8 as u}from"./chunks/framework.CoRJFuj9.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{"outline":false},"headers":[],"relativePath":"指南/简介/YouQu3是什么.md","filePath":"指南/简介/YouQu3是什么.md","lastUpdated":1721408535000}'),i={name:"指南/简介/YouQu3是什么.md"},n=o("",13),r=[n];function l(s,p,_,c,h,d){return a(),t("div",null,r)}const g=e(i,[["render",l]]);export{f as __pageData,g as default}; diff --git "a/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.CYgh_n0r.js" "b/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.CYgh_n0r.js" deleted file mode 100644 index 1733bc1..0000000 --- "a/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.CYgh_n0r.js" +++ /dev/null @@ -1,2 +0,0 @@ -import{_ as s,c as a,o as i,U as t,a9 as e,aa as l}from"./chunks/framework.CoRJFuj9.js";const F=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"指南/简介/快速开始.md","filePath":"指南/简介/快速开始.md","lastUpdated":1721405890000}'),p={name:"指南/简介/快速开始.md"},n=t('

    快速开始

    安装

    bash
    pip install youqu3
    bash
    pip install "youqu3[gui]"
    bash
    pip install "youqu3[webui]"
    bash
    pip install "youqu3[dbus]"
    bash
    pip install "youqu3[http]"
    bash
    pip install "youqu3[remote]"

    注意

    • 根据不同的测试类型选择以上不同的安装命令,可以自动安装对应的依赖集。
    • 基础环境默认支持 Linux 命令行自动化
    • 同时选择多个环境:pip install "youqu3[gui, webui]"

    创建用例工程

    创建一个目录

    bash
    mkdir my_autotest

    使用脚手架功能创建用例工程

    bash
    cd my_autotest/
    -youqu3 init

    ',11),h=[n];function o(d,c,r,k,u,b){return i(),a("div",null,h)}const v=s(p,[["render",o]]);export{F as __pageData,v as default}; diff --git "a/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.DgOYFTsc.js" "b/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.DgOYFTsc.js" new file mode 100644 index 0000000..df8b8a2 --- /dev/null +++ "b/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.DgOYFTsc.js" @@ -0,0 +1,2 @@ +import{_ as s,c as a,o as i,U as t,a9 as e,aa as l}from"./chunks/framework.CoRJFuj9.js";const F=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"指南/简介/快速开始.md","filePath":"指南/简介/快速开始.md","lastUpdated":1721408535000}'),p={name:"指南/简介/快速开始.md"},n=t('

    快速开始

    安装

    bash
    pip install youqu3
    bash
    pip install "youqu3[gui]"
    bash
    pip install "youqu3[webui]"
    bash
    pip install "youqu3[http]"
    bash
    pip install "youqu3[remote]"

    注意

    • 根据不同的测试类型选择以上不同的安装命令,可以自动安装对应的依赖集。
    • 基础环境默认支持 Linux 命令行自动化
    • 同时选择多个环境:pip install "youqu3[gui, webui]"

    创建用例工程

    创建一个目录

    bash
    mkdir my_autotest

    使用脚手架功能创建用例工程

    bash
    cd my_autotest/
    +youqu3 init

    ',11),h=[n];function o(d,c,r,k,u,g){return i(),a("div",null,h)}const y=s(p,[["render",o]]);export{F as __pageData,y as default}; diff --git "a/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.CYgh_n0r.lean.js" "b/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.DgOYFTsc.lean.js" similarity index 53% rename from "assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.CYgh_n0r.lean.js" rename to "assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.DgOYFTsc.lean.js" index c98bd54..9fee9c2 100644 --- "a/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.CYgh_n0r.lean.js" +++ "b/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.DgOYFTsc.lean.js" @@ -1 +1 @@ -import{_ as s,c as a,o as i,U as t,a9 as e,aa as l}from"./chunks/framework.CoRJFuj9.js";const F=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"指南/简介/快速开始.md","filePath":"指南/简介/快速开始.md","lastUpdated":1721405890000}'),p={name:"指南/简介/快速开始.md"},n=t("",11),h=[n];function o(d,c,r,k,u,b){return i(),a("div",null,h)}const v=s(p,[["render",o]]);export{F as __pageData,v as default}; +import{_ as s,c as a,o as i,U as t,a9 as e,aa as l}from"./chunks/framework.CoRJFuj9.js";const F=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"指南/简介/快速开始.md","filePath":"指南/简介/快速开始.md","lastUpdated":1721408535000}'),p={name:"指南/简介/快速开始.md"},n=t("",11),h=[n];function o(d,c,r,k,u,g){return i(),a("div",null,h)}const y=s(p,[["render",o]]);export{F as __pageData,y as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.BAPxDBnz.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.D7xXXuqS.js" similarity index 88% rename from "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.BAPxDBnz.js" rename to "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.D7xXXuqS.js" index 41782d0..ab9d5cf 100644 --- "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.BAPxDBnz.js" +++ "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.D7xXXuqS.js" @@ -1,4 +1,4 @@ -import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"本地执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/本地执行.md","filePath":"指南/驱动执行/本地执行.md","lastUpdated":1721405890000}'),e={name:"指南/驱动执行/本地执行.md"},p=t(`

    本地执行

    子命令

    本地执行子命令为:run

    bash
    $ youqu3 run
    bash
    $ youqu3-cargo run

    用例驱动方式

    执行所有用例

    bash
    $ youqu3 run
    bash
    $ youqu3-cargo run

    指定执行某一个用例

    python
    # test_xxx_001.py
    +import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"本地执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/本地执行.md","filePath":"指南/驱动执行/本地执行.md","lastUpdated":1721408535000}'),e={name:"指南/驱动执行/本地执行.md"},p=t(`

    本地执行

    子命令

    本地执行子命令为:run

    bash
    $ youqu3 run
    bash
    $ youqu3-cargo run

    用例驱动方式

    执行所有用例

    bash
    $ youqu3 run
    bash
    $ youqu3-cargo run

    指定执行某一个用例

    python
    # test_xxx_001.py
     
     class TestCase:
         
    @@ -6,10 +6,10 @@ import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const g=
             ...
             
         def test_xxx_001_2(self):
    -        ...

    仅驱动执行这一条用例:

    bash
    $ youqu3 run -k test_xxx_001_1
    bash
    $ youqu3-cargo run -k test_xxx_001_1

    如果你想执行这个 py 文件中所有的用例:

    bash
    $ youqu3 run -k test_xxx_001
    bash
    $ youqu3-cargo run -k test_xxx_001

    指定某个目录执行

    shell
    autotest-my-app
    +        ...

    仅驱动执行这一条用例:

    bash
    $ youqu3 run -k test_xxx_001_1
    bash
    $ youqu3-cargo run -k test_xxx_001_1

    如果你想执行这个 py 文件中所有的用例:

    bash
    $ youqu3 run -k test_xxx_001
    bash
    $ youqu3-cargo run -k test_xxx_001

    指定某个目录执行

    shell
    autotest-my-app
     ├── case
     │   ├── base_case.py
     │   ├── __init__.py
     │   ├── smoke
     │  	├── test_mycase_001.py
    -│  	└── test_mycase_002.py

    驱动执行 smoke 目录下所有用例:

    bash
    $ youqu3 run -k smoke
    bash
    $ youqu3-cargo run -k smoke

    根据关键词执行

    执行包含关键词的用例,关键词可以是用例对象中的任意字符,且大小写不敏感

    模块名称、py 文件名称、类名、函数名等等都可以做为关键词

    比如:case/test_music_001.py::TestMusic::test_music_001

    整个字符串中可以任意截取字符作为关键词。

    关键词驱动支持 and/or/not 表达式。

    bash
    $ youqu3 run -k "music and 001"
    bash
    $ youqu3-cargo run -k "music and 001"

    注意:

    使用逻辑表达式的时候一定要加引号:"music and 001"

    根据标签执行

    基于 YouQu 特有的 CSV 文件管理的标签,也可以是传统的 Pytest 标签:@pytest.mark.L1

    标签驱动支持 and/or/not 表达式。

    bash
    $ youqu3 run -t "L1 or smoke"
    bash
    $ youqu3-cargo run -t "L1 or smoke"

    批量用例ID驱动执行

    bash
    $ youqu3 run -t "id1 or id2 or id3 or id4"
    bash
    $ youqu3-cargo run -t "id1 or id2 or id3 or id4"

    注意:

    使用逻辑表达式的时候一定要加引号:"id1 or id2 or id3 or id4"

    指定用例文件路径执行

    指定用例文件

    bash
    $ youqu3 run -f case/test_music_001.py
    bash
    $ youqu3-cargo run -f case/test_music_001.py

    指定用例目录

    bash
    $ youqu3 run -f case
    bash
    $ youqu3-cargo run -f case

    用例文件、目录组合

    bash
    $ youqu3 run -f "case/test_music_001.py case/test_music_002.py"
    bash
    $ youqu3-cargo run -f "case/test_music_001.py case/test_music_002.py"

    注意:

    多个用例文件、目录之间用空格分割,加引号

    `,40),l=[p];function h(n,d,k,o,c,r){return i(),a("div",null,l)}const u=s(e,[["render",h]]);export{g as __pageData,u as default}; +│   └── test_mycase_002.py

    驱动执行 smoke 目录下所有用例:

    bash
    $ youqu3 run -k smoke
    bash
    $ youqu3-cargo run -k smoke

    根据关键词执行

    执行包含关键词的用例,关键词可以是用例对象中的任意字符,且大小写不敏感

    模块名称、py 文件名称、类名、函数名等等都可以做为关键词

    比如:case/test_music_001.py::TestMusic::test_music_001

    整个字符串中可以任意截取字符作为关键词。

    关键词驱动支持 and/or/not 表达式。

    bash
    $ youqu3 run -k "music and 001"
    bash
    $ youqu3-cargo run -k "music and 001"

    注意:

    使用逻辑表达式的时候一定要加引号:"music and 001"

    根据标签执行

    基于 YouQu 特有的 CSV 文件管理的标签,也可以是传统的 Pytest 标签:@pytest.mark.L1

    标签驱动支持 and/or/not 表达式。

    bash
    $ youqu3 run -t "L1 or smoke"
    bash
    $ youqu3-cargo run -t "L1 or smoke"

    批量用例ID驱动执行

    bash
    $ youqu3 run -t "id1 or id2 or id3 or id4"
    bash
    $ youqu3-cargo run -t "id1 or id2 or id3 or id4"

    注意:

    使用逻辑表达式的时候一定要加引号:"id1 or id2 or id3 or id4"

    指定用例文件路径执行

    指定用例文件

    bash
    $ youqu3 run -f case/test_music_001.py
    bash
    $ youqu3-cargo run -f case/test_music_001.py

    指定用例目录

    bash
    $ youqu3 run -f case
    bash
    $ youqu3-cargo run -f case

    用例文件、目录组合

    bash
    $ youqu3 run -f "case/test_music_001.py case/test_music_002.py"
    bash
    $ youqu3-cargo run -f "case/test_music_001.py case/test_music_002.py"

    注意:

    多个用例文件、目录之间用空格分割,加引号

    `,40),l=[p];function h(n,d,k,o,c,r){return i(),a("div",null,l)}const u=s(e,[["render",h]]);export{g as __pageData,u as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.BAPxDBnz.lean.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.D7xXXuqS.lean.js" similarity index 86% rename from "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.BAPxDBnz.lean.js" rename to "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.D7xXXuqS.lean.js" index 90a3d42..5c4a16e 100644 --- "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.BAPxDBnz.lean.js" +++ "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.D7xXXuqS.lean.js" @@ -1 +1 @@ -import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"本地执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/本地执行.md","filePath":"指南/驱动执行/本地执行.md","lastUpdated":1721405890000}'),e={name:"指南/驱动执行/本地执行.md"},p=t("",40),l=[p];function h(n,d,k,o,c,r){return i(),a("div",null,l)}const u=s(e,[["render",h]]);export{g as __pageData,u as default}; +import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"本地执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/本地执行.md","filePath":"指南/驱动执行/本地执行.md","lastUpdated":1721408535000}'),e={name:"指南/驱动执行/本地执行.md"},p=t("",40),l=[p];function h(n,d,k,o,c,r){return i(),a("div",null,l)}const u=s(e,[["render",h]]);export{g as __pageData,u as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.BMI8aDbA.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.CJzKfzmA.js" similarity index 95% rename from "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.BMI8aDbA.js" rename to "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.CJzKfzmA.js" index b2df5d3..b5d25d7 100644 --- "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.BMI8aDbA.js" +++ "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.CJzKfzmA.js" @@ -1 +1 @@ -import{_ as t,c as a,o,U as e}from"./chunks/framework.CoRJFuj9.js";const x=JSON.parse('{"title":"自定义执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/自定义执行.md","filePath":"指南/驱动执行/自定义执行.md","lastUpdated":1721405890000}'),s={name:"指南/驱动执行/自定义执行.md"},u=e('

    自定义执行

    YouQu3 支持在 txt 文件中自定义用例集驱动执行:

    • youqu-tags.txt
    • youqu-keywords.txt

    youqu-tags.txt

    在根目录下定义 youqu-tags.txt 文件,YouQu3 会自动加载并执行。

    youqu-tags.txt 文件里面写标签的表达式,如:

    youqu-tags.txt

    id1 or id2 or id3

    youqu-keywords.txt

    ',8),r=[u];function d(i,c,l,_,n,p){return o(),a("div",null,r)}const q=t(s,[["render",d]]);export{x as __pageData,q as default}; +import{_ as t,c as a,o,U as e}from"./chunks/framework.CoRJFuj9.js";const x=JSON.parse('{"title":"自定义执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/自定义执行.md","filePath":"指南/驱动执行/自定义执行.md","lastUpdated":1721408535000}'),s={name:"指南/驱动执行/自定义执行.md"},u=e('

    自定义执行

    YouQu3 支持在 txt 文件中自定义用例集驱动执行:

    • youqu-tags.txt
    • youqu-keywords.txt

    youqu-tags.txt

    在根目录下定义 youqu-tags.txt 文件,YouQu3 会自动加载并执行。

    youqu-tags.txt 文件里面写标签的表达式,如:

    youqu-tags.txt

    id1 or id2 or id3

    youqu-keywords.txt

    ',8),r=[u];function d(i,c,l,_,n,p){return o(),a("div",null,r)}const q=t(s,[["render",d]]);export{x as __pageData,q as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.BMI8aDbA.lean.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.CJzKfzmA.lean.js" similarity index 86% rename from "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.BMI8aDbA.lean.js" rename to "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.CJzKfzmA.lean.js" index 45a7bfc..979b272 100644 --- "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.BMI8aDbA.lean.js" +++ "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.CJzKfzmA.lean.js" @@ -1 +1 @@ -import{_ as t,c as a,o,U as e}from"./chunks/framework.CoRJFuj9.js";const x=JSON.parse('{"title":"自定义执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/自定义执行.md","filePath":"指南/驱动执行/自定义执行.md","lastUpdated":1721405890000}'),s={name:"指南/驱动执行/自定义执行.md"},u=e("",8),r=[u];function d(i,c,l,_,n,p){return o(),a("div",null,r)}const q=t(s,[["render",d]]);export{x as __pageData,q as default}; +import{_ as t,c as a,o,U as e}from"./chunks/framework.CoRJFuj9.js";const x=JSON.parse('{"title":"自定义执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/自定义执行.md","filePath":"指南/驱动执行/自定义执行.md","lastUpdated":1721408535000}'),s={name:"指南/驱动执行/自定义执行.md"},u=e("",8),r=[u];function d(i,c,l,_,n,p){return o(),a("div",null,r)}const q=t(s,[["render",d]]);export{x as __pageData,q as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.4YLRDRlF.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.tigHGXwZ.js" similarity index 89% rename from "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.4YLRDRlF.js" rename to "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.tigHGXwZ.js" index 4c2fe64..0be82c3 100644 --- "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.4YLRDRlF.js" +++ "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.tigHGXwZ.js" @@ -1 +1 @@ -import{_ as s,c as a,o as i,U as e}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"远程执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/远程执行.md","filePath":"指南/驱动执行/远程执行.md","lastUpdated":1721405890000}'),t={name:"指南/驱动执行/远程执行.md"},p=e('

    远程执行

    子命令

    远程执行就是用本地作为服务端控制远程机器执行,远程机器执行的用例相同;

    远程执行使用子命令: remote

    bash
    $ youqu3 remote -e
    bash
    $ youqu3-cargo remote -e
    开启 SSH

    执行前确保远程机器已经开启了 SSH 服务,否则会提示无法连接:

    bash
    $ sudo systemctl restart ssh

    远程测试机分组策略

    分组规则

    一对大括号表示一个组:

    txt
    {user1@ip1/user2@ip2}{user3@ip3/user4@ip4}

    以上写法表示有 2 个组(group):

    • group1 : user1@ip1/user2@ip2
    • group2 : user3@ip3/user4@ip4

    执行策略

    规则概述

    同一组内瓜分执行,不同组之间相同执行

    bash
    $ youqu3 remote -c "{user1@ip1/user2@ip2}{user3@ip3/user4@ip4}"
    bash
    $ youqu3-cargo remote -c "{user1@ip1/user2@ip2}{user3@ip3/user4@ip4}"

    假设总共 100 条用例:

    • group1group2同时执行 100 条
    • group1 包含 2 个测试机,2 个机器瓜分 100 条用例,每个机器执行 50 条
    ',17),l=[p];function d(o,h,n,c,r,k){return i(),a("div",null,l)}const b=s(t,[["render",d]]);export{g as __pageData,b as default}; +import{_ as s,c as a,o as i,U as e}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"远程执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/远程执行.md","filePath":"指南/驱动执行/远程执行.md","lastUpdated":1721408535000}'),t={name:"指南/驱动执行/远程执行.md"},p=e('

    远程执行

    子命令

    远程执行就是用本地作为服务端控制远程机器执行,远程机器执行的用例相同;

    远程执行使用子命令: remote

    bash
    $ youqu3 remote -e
    bash
    $ youqu3-cargo remote -e
    开启 SSH

    执行前确保远程机器已经开启了 SSH 服务,否则会提示无法连接:

    bash
    $ sudo systemctl restart ssh

    远程测试机分组策略

    分组规则

    一对大括号表示一个组:

    txt
    {user1@ip1/user2@ip2}{user3@ip3/user4@ip4}

    以上写法表示有 2 个组(group):

    • group1 : user1@ip1/user2@ip2
    • group2 : user3@ip3/user4@ip4

    执行策略

    规则概述

    同一组内瓜分执行,不同组之间相同执行

    bash
    $ youqu3 remote -c "{user1@ip1/user2@ip2}{user3@ip3/user4@ip4}"
    bash
    $ youqu3-cargo remote -c "{user1@ip1/user2@ip2}{user3@ip3/user4@ip4}"

    假设总共 100 条用例:

    • group1group2同时执行 100 条
    • group1 包含 2 个测试机,2 个机器瓜分 100 条用例,每个机器执行 50 条
    ',17),l=[p];function o(d,h,n,c,r,k){return i(),a("div",null,l)}const b=s(t,[["render",o]]);export{g as __pageData,b as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.4YLRDRlF.lean.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.tigHGXwZ.lean.js" similarity index 59% rename from "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.4YLRDRlF.lean.js" rename to "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.tigHGXwZ.lean.js" index 48291dc..e15411a 100644 --- "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.4YLRDRlF.lean.js" +++ "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.tigHGXwZ.lean.js" @@ -1 +1 @@ -import{_ as s,c as a,o as i,U as e}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"远程执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/远程执行.md","filePath":"指南/驱动执行/远程执行.md","lastUpdated":1721405890000}'),t={name:"指南/驱动执行/远程执行.md"},p=e("",17),l=[p];function d(o,h,n,c,r,k){return i(),a("div",null,l)}const b=s(t,[["render",d]]);export{g as __pageData,b as default}; +import{_ as s,c as a,o as i,U as e}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"远程执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/远程执行.md","filePath":"指南/驱动执行/远程执行.md","lastUpdated":1721408535000}'),t={name:"指南/驱动执行/远程执行.md"},p=e("",17),l=[p];function o(d,h,n,c,r,k){return i(),a("div",null,l)}const b=s(t,[["render",o]]);export{g as __pageData,b as default}; diff --git "a/assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.ym2kX19V.js" "b/assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.B46p_EM-.js" similarity index 83% rename from "assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.ym2kX19V.js" rename to "assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.B46p_EM-.js" index d91b4b1..03672ea 100644 --- "a/assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.ym2kX19V.js" +++ "b/assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.B46p_EM-.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/DBus操控.md","filePath":"插件/DBus操控.md","lastUpdated":1721405890000}'),s={name:"插件/DBus操控.md"};function r(o,c,n,_,d,p){return a(),t("div")}const f=e(s,[["render",r]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/DBus操控.md","filePath":"插件/DBus操控.md","lastUpdated":1721408535000}'),s={name:"插件/DBus操控.md"};function r(o,c,n,_,d,p){return a(),t("div")}const f=e(s,[["render",r]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.ym2kX19V.lean.js" "b/assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.B46p_EM-.lean.js" similarity index 83% rename from "assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.ym2kX19V.lean.js" rename to "assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.B46p_EM-.lean.js" index d91b4b1..03672ea 100644 --- "a/assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.ym2kX19V.lean.js" +++ "b/assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.B46p_EM-.lean.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/DBus操控.md","filePath":"插件/DBus操控.md","lastUpdated":1721405890000}'),s={name:"插件/DBus操控.md"};function r(o,c,n,_,d,p){return a(),t("div")}const f=e(s,[["render",r]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/DBus操控.md","filePath":"插件/DBus操控.md","lastUpdated":1721408535000}'),s={name:"插件/DBus操控.md"};function r(o,c,n,_,d,p){return a(),t("div")}const f=e(s,[["render",r]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.BlaVBpz0.js" "b/assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.BO3ILMEt.js" similarity index 84% rename from "assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.BlaVBpz0.js" rename to "assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.BO3ILMEt.js" index beed037..6e84a9f 100644 --- "a/assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.BlaVBpz0.js" +++ "b/assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.BO3ILMEt.js" @@ -1 +1 @@ -import{_ as t,c as e,o as a}from"./chunks/framework.CoRJFuj9.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/Html测试报告.md","filePath":"插件/Html测试报告.md","lastUpdated":1721405890000}'),r={name:"插件/Html测试报告.md"};function o(s,c,n,_,m,d){return a(),e("div")}const i=t(r,[["render",o]]);export{p as __pageData,i as default}; +import{_ as t,c as e,o as a}from"./chunks/framework.CoRJFuj9.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/Html测试报告.md","filePath":"插件/Html测试报告.md","lastUpdated":1721408535000}'),r={name:"插件/Html测试报告.md"};function o(s,c,n,_,m,d){return a(),e("div")}const i=t(r,[["render",o]]);export{p as __pageData,i as default}; diff --git "a/assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.BlaVBpz0.lean.js" "b/assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.BO3ILMEt.lean.js" similarity index 84% rename from "assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.BlaVBpz0.lean.js" rename to "assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.BO3ILMEt.lean.js" index beed037..6e84a9f 100644 --- "a/assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.BlaVBpz0.lean.js" +++ "b/assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.BO3ILMEt.lean.js" @@ -1 +1 @@ -import{_ as t,c as e,o as a}from"./chunks/framework.CoRJFuj9.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/Html测试报告.md","filePath":"插件/Html测试报告.md","lastUpdated":1721405890000}'),r={name:"插件/Html测试报告.md"};function o(s,c,n,_,m,d){return a(),e("div")}const i=t(r,[["render",o]]);export{p as __pageData,i as default}; +import{_ as t,c as e,o as a}from"./chunks/framework.CoRJFuj9.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/Html测试报告.md","filePath":"插件/Html测试报告.md","lastUpdated":1721408535000}'),r={name:"插件/Html测试报告.md"};function o(s,c,n,_,m,d){return a(),e("div")}const i=t(r,[["render",o]]);export{p as __pageData,i as default}; diff --git "a/assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BmKTwhFO.js" "b/assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BbvIdL2A.js" similarity index 99% rename from "assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BmKTwhFO.js" rename to "assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BbvIdL2A.js" index df5ceb2..45e168c 100644 --- "a/assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BmKTwhFO.js" +++ "b/assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BbvIdL2A.js" @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.CoRJFuj9.js";const E=JSON.parse('{"title":"pdocr-rpc","description":"","frontmatter":{},"headers":[],"relativePath":"插件/OCR识别.md","filePath":"插件/OCR识别.md","lastUpdated":1721405890000}'),e={name:"插件/OCR识别.md"},p=t(`

    pdocr-rpc

    Source Code: https://github.com/linuxdeepin/pdocr-rpc

    基于 PaddleOCR 封装的 RPC 服务,包含客户端和服务端。

    客户端提供了一个简单易用的函数 ocr,通过不同的参数控制返回不同的值。

    1、服务端

    服务端安装

    console
    pip install pdocr-rpc[server]

    服务端启动服务

    随意新建一个py文件,名称你可以自定义,比如:ocr_server.py

    写入以下内容:

    python
    # ocr_server.py
    +import{_ as s,c as i,o as a,U as t}from"./chunks/framework.CoRJFuj9.js";const E=JSON.parse('{"title":"pdocr-rpc","description":"","frontmatter":{},"headers":[],"relativePath":"插件/OCR识别.md","filePath":"插件/OCR识别.md","lastUpdated":1721408535000}'),e={name:"插件/OCR识别.md"},p=t(`

    pdocr-rpc

    Source Code: https://github.com/linuxdeepin/pdocr-rpc

    基于 PaddleOCR 封装的 RPC 服务,包含客户端和服务端。

    客户端提供了一个简单易用的函数 ocr,通过不同的参数控制返回不同的值。

    1、服务端

    服务端安装

    console
    pip install pdocr-rpc[server]

    服务端启动服务

    随意新建一个py文件,名称你可以自定义,比如:ocr_server.py

    写入以下内容:

    python
    # ocr_server.py
     from pdocr_rpc.server import server
     
     server()

    默认端口号为 8890 如果你想修改端口:

    python
    from pdocr_rpc.server import server
    diff --git "a/assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BmKTwhFO.lean.js" "b/assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BbvIdL2A.lean.js"
    similarity index 84%
    rename from "assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BmKTwhFO.lean.js"
    rename to "assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BbvIdL2A.lean.js"
    index a746db3..740268d 100644
    --- "a/assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BmKTwhFO.lean.js"
    +++ "b/assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BbvIdL2A.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.CoRJFuj9.js";const E=JSON.parse('{"title":"pdocr-rpc","description":"","frontmatter":{},"headers":[],"relativePath":"插件/OCR识别.md","filePath":"插件/OCR识别.md","lastUpdated":1721405890000}'),e={name:"插件/OCR识别.md"},p=t("",30),n=[p];function h(l,r,k,o,d,c){return a(),i("div",null,n)}const y=s(e,[["render",h]]);export{E as __pageData,y as default};
    +import{_ as s,c as i,o as a,U as t}from"./chunks/framework.CoRJFuj9.js";const E=JSON.parse('{"title":"pdocr-rpc","description":"","frontmatter":{},"headers":[],"relativePath":"插件/OCR识别.md","filePath":"插件/OCR识别.md","lastUpdated":1721408535000}'),e={name:"插件/OCR识别.md"},p=t("",30),n=[p];function h(l,r,k,o,d,c){return a(),i("div",null,n)}const y=s(e,[["render",h]]);export{E as __pageData,y as default};
    diff --git "a/assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.HcMsemJe.js" "b/assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.C3RnWS9a.js"
    similarity index 84%
    rename from "assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.HcMsemJe.js"
    rename to "assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.C3RnWS9a.js"
    index 536793e..0f04246 100644
    --- "a/assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.HcMsemJe.js"
    +++ "b/assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.C3RnWS9a.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/PMS测试单驱动.md","filePath":"插件/PMS测试单驱动.md","lastUpdated":1721405890000}'),r={name:"插件/PMS测试单驱动.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/PMS测试单驱动.md","filePath":"插件/PMS测试单驱动.md","lastUpdated":1721408535000}'),r={name:"插件/PMS测试单驱动.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.HcMsemJe.lean.js" "b/assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.C3RnWS9a.lean.js"
    similarity index 84%
    rename from "assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.HcMsemJe.lean.js"
    rename to "assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.C3RnWS9a.lean.js"
    index 536793e..0f04246 100644
    --- "a/assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.HcMsemJe.lean.js"
    +++ "b/assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.C3RnWS9a.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/PMS测试单驱动.md","filePath":"插件/PMS测试单驱动.md","lastUpdated":1721405890000}'),r={name:"插件/PMS测试单驱动.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/PMS测试单驱动.md","filePath":"插件/PMS测试单驱动.md","lastUpdated":1721408535000}'),r={name:"插件/PMS测试单驱动.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.Ckc9aI7N.js" "b/assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.DYY4Enyl.js"
    similarity index 84%
    rename from "assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.Ckc9aI7N.js"
    rename to "assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.DYY4Enyl.js"
    index f462361..a74e42d 100644
    --- "a/assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.Ckc9aI7N.js"
    +++ "b/assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.DYY4Enyl.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/WebUI自动化.md","filePath":"插件/WebUI自动化.md","lastUpdated":1721405890000}'),r={name:"插件/WebUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/WebUI自动化.md","filePath":"插件/WebUI自动化.md","lastUpdated":1721408535000}'),r={name:"插件/WebUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.Ckc9aI7N.lean.js" "b/assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.DYY4Enyl.lean.js"
    similarity index 84%
    rename from "assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.Ckc9aI7N.lean.js"
    rename to "assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.DYY4Enyl.lean.js"
    index f462361..a74e42d 100644
    --- "a/assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.Ckc9aI7N.lean.js"
    +++ "b/assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.DYY4Enyl.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/WebUI自动化.md","filePath":"插件/WebUI自动化.md","lastUpdated":1721405890000}'),r={name:"插件/WebUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/WebUI自动化.md","filePath":"插件/WebUI自动化.md","lastUpdated":1721408535000}'),r={name:"插件/WebUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BEwHeE6g.js" "b/assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BybnXbQR.js"
    similarity index 99%
    rename from "assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BEwHeE6g.js"
    rename to "assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BybnXbQR.js"
    index 6b55e00..3fb1180 100644
    --- "a/assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BEwHeE6g.js"
    +++ "b/assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BybnXbQR.js"
    @@ -1,4 +1,4 @@
    -import{_ as s,c as i,o as a,U as n,ab as l,ac as p,ad as t}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"FunnyLog","description":"","frontmatter":{},"headers":[],"relativePath":"插件/全自动日志.md","filePath":"插件/全自动日志.md","lastUpdated":1721405890000}'),h={name:"插件/全自动日志.md"},k=n(`

    FunnyLog

    Source Code: https://github.com/linuxdeepin/funnylog

    一个简单易用、功能强大的日志工具。

    只需要加一个装饰器,就能自动日志输出类里面所有的方法的功能说明。

    安装

    console
    pip install funnylog

    使用方法

    1、自动输出日志

    py
    #!/usr/bin/env python3
    +import{_ as s,c as i,o as a,U as n,ab as l,ac as p,ad as t}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"FunnyLog","description":"","frontmatter":{},"headers":[],"relativePath":"插件/全自动日志.md","filePath":"插件/全自动日志.md","lastUpdated":1721408535000}'),h={name:"插件/全自动日志.md"},k=n(`

    FunnyLog

    Source Code: https://github.com/linuxdeepin/funnylog

    一个简单易用、功能强大的日志工具。

    只需要加一个装饰器,就能自动日志输出类里面所有的方法的功能说明。

    安装

    console
    pip install funnylog

    使用方法

    1、自动输出日志

    py
    #!/usr/bin/env python3
     # _*_ coding:utf-8 _*_
     
     # SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
    diff --git "a/assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BEwHeE6g.lean.js" "b/assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BybnXbQR.lean.js"
    similarity index 86%
    rename from "assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BEwHeE6g.lean.js"
    rename to "assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BybnXbQR.lean.js"
    index 10626e4..876f77c 100644
    --- "a/assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BEwHeE6g.lean.js"
    +++ "b/assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BybnXbQR.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as n,ab as l,ac as p,ad as t}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"FunnyLog","description":"","frontmatter":{},"headers":[],"relativePath":"插件/全自动日志.md","filePath":"插件/全自动日志.md","lastUpdated":1721405890000}'),h={name:"插件/全自动日志.md"},k=n("",21),e=[k];function o(g,r,E,d,c,y){return a(),i("div",null,e)}const _=s(h,[["render",o]]);export{u as __pageData,_ as default};
    +import{_ as s,c as i,o as a,U as n,ab as l,ac as p,ad as t}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"FunnyLog","description":"","frontmatter":{},"headers":[],"relativePath":"插件/全自动日志.md","filePath":"插件/全自动日志.md","lastUpdated":1721408535000}'),h={name:"插件/全自动日志.md"},k=n("",21),e=[k];function o(g,r,E,d,c,y){return a(),i("div",null,e)}const _=s(h,[["render",o]]);export{u as __pageData,_ as default};
    diff --git "a/assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.BPU6yt_e.js" "b/assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.CUSgLZyr.js"
    similarity index 83%
    rename from "assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.BPU6yt_e.js"
    rename to "assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.CUSgLZyr.js"
    index 5451679..8ede8dc 100644
    --- "a/assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.BPU6yt_e.js"
    +++ "b/assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.CUSgLZyr.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/图像识别.md","filePath":"插件/图像识别.md","lastUpdated":1721405890000}'),r={name:"插件/图像识别.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/图像识别.md","filePath":"插件/图像识别.md","lastUpdated":1721408535000}'),r={name:"插件/图像识别.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.BPU6yt_e.lean.js" "b/assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.CUSgLZyr.lean.js"
    similarity index 83%
    rename from "assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.BPU6yt_e.lean.js"
    rename to "assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.CUSgLZyr.lean.js"
    index 5451679..8ede8dc 100644
    --- "a/assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.BPU6yt_e.lean.js"
    +++ "b/assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.CUSgLZyr.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/图像识别.md","filePath":"插件/图像识别.md","lastUpdated":1721405890000}'),r={name:"插件/图像识别.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/图像识别.md","filePath":"插件/图像识别.md","lastUpdated":1721408535000}'),r={name:"插件/图像识别.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.BUlxFkty.js" "b/assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.BIoism-O.js"
    similarity index 83%
    rename from "assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.BUlxFkty.js"
    rename to "assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.BIoism-O.js"
    index 21a9a81..02ac77a 100644
    --- "a/assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.BUlxFkty.js"
    +++ "b/assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.BIoism-O.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/属性识别.md","filePath":"插件/属性识别.md","lastUpdated":1721405890000}'),r={name:"插件/属性识别.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/属性识别.md","filePath":"插件/属性识别.md","lastUpdated":1721408535000}'),r={name:"插件/属性识别.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.BUlxFkty.lean.js" "b/assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.BIoism-O.lean.js"
    similarity index 83%
    rename from "assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.BUlxFkty.lean.js"
    rename to "assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.BIoism-O.lean.js"
    index 21a9a81..02ac77a 100644
    --- "a/assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.BUlxFkty.lean.js"
    +++ "b/assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.BIoism-O.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/属性识别.md","filePath":"插件/属性识别.md","lastUpdated":1721405890000}'),r={name:"插件/属性识别.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/属性识别.md","filePath":"插件/属性识别.md","lastUpdated":1721408535000}'),r={name:"插件/属性识别.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.C_KGzTAT.js" "b/assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.uvT93bNC.js"
    similarity index 98%
    rename from "assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.C_KGzTAT.js"
    rename to "assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.uvT93bNC.js"
    index 2663a31..ea5ee88 100644
    --- "a/assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.C_KGzTAT.js"
    +++ "b/assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.uvT93bNC.js"
    @@ -1 +1 @@
    -import{_ as t,c as e,o as r,U as d}from"./chunks/framework.CoRJFuj9.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/插件列表.md","filePath":"插件/插件列表.md","lastUpdated":1721405890000}'),a={name:"插件/插件列表.md"},n=d('

    YouQu3 插件汇总信息

    NUMNAMEDESCUSABLE
    1youqu-dogtail属性定位插件✔️
    2youqu-imagecenter-rpc基于 RPC 服务的图像识别插件✔️
    3youqu-mousekey键鼠操作插件✔️
    4pydbussendD-Bus 操控插件✔️
    5youqu-pms-driverPMS 测试单驱动插件✔️
    6youqu-button-center相对位移定位插件✔️
    7pytest-mark-manage用例标签化管理插件✔️
    8pytest-youqu-playwright基于 Playwright 的 Web UI 自动化插件✔️
    9youqu-htmlYouQu Html Report✔️
    10pytest-record-video用例失败录屏插件✔️
    11funnylog2全自动日志插件✔️
    12pdocr-rpc基于 RPC 服务的 OCR 识别插件✔️
    13wdotoolWayland 下完美的键鼠工具🚧
    14youqu-git-commit自动统计分析每次 Commit 中用例增删改、方法增删改的详细数据🚧
    15pylinuxauto 🔥Linux GUI 自动化测试模块✔️
    16youqu2-transfer-youqu3迁移工具:将基于YouQu2的用例代码修改为YouQu3✔️
    17youqu3-dragonYouQu3 Web 可视化驱动🚧
    ',2),o=[n];function u(l,y,h,s,i,c){return r(),e("div",null,o)}const m=t(a,[["render",u]]);export{f as __pageData,m as default}; +import{_ as t,c as e,o as r,U as d}from"./chunks/framework.CoRJFuj9.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/插件列表.md","filePath":"插件/插件列表.md","lastUpdated":1721408535000}'),a={name:"插件/插件列表.md"},n=d('

    YouQu3 插件汇总信息

    NUMNAMEDESCUSABLE
    1youqu-dogtail属性定位插件✔️
    2youqu-imagecenter-rpc基于 RPC 服务的图像识别插件✔️
    3youqu-mousekey键鼠操作插件✔️
    4pydbussendD-Bus 操控插件✔️
    5youqu-pms-driverPMS 测试单驱动插件✔️
    6youqu-button-center相对位移定位插件✔️
    7pytest-mark-manage用例标签化管理插件✔️
    8pytest-youqu-playwright基于 Playwright 的 Web UI 自动化插件✔️
    9youqu-htmlYouQu Html Report✔️
    10pytest-record-video用例失败录屏插件✔️
    11funnylog2全自动日志插件✔️
    12pdocr-rpc基于 RPC 服务的 OCR 识别插件✔️
    13wdotoolWayland 下完美的键鼠工具🚧
    14youqu-git-commit自动统计分析每次 Commit 中用例增删改、方法增删改的详细数据🚧
    15pylinuxauto 🔥Linux GUI 自动化测试模块✔️
    16youqu2-transfer-youqu3迁移工具:将基于YouQu2的用例代码修改为YouQu3✔️
    17youqu3-dragonYouQu3 Web 可视化驱动🚧
    ',2),o=[n];function u(l,y,h,s,i,c){return r(),e("div",null,o)}const m=t(a,[["render",u]]);export{f as __pageData,m as default}; diff --git "a/assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.C_KGzTAT.lean.js" "b/assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.uvT93bNC.lean.js" similarity index 84% rename from "assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.C_KGzTAT.lean.js" rename to "assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.uvT93bNC.lean.js" index 30daaff..e9c085c 100644 --- "a/assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.C_KGzTAT.lean.js" +++ "b/assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.uvT93bNC.lean.js" @@ -1 +1 @@ -import{_ as t,c as e,o as r,U as d}from"./chunks/framework.CoRJFuj9.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/插件列表.md","filePath":"插件/插件列表.md","lastUpdated":1721405890000}'),a={name:"插件/插件列表.md"},n=d("",2),o=[n];function u(l,y,h,s,i,c){return r(),e("div",null,o)}const m=t(a,[["render",u]]);export{f as __pageData,m as default}; +import{_ as t,c as e,o as r,U as d}from"./chunks/framework.CoRJFuj9.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/插件列表.md","filePath":"插件/插件列表.md","lastUpdated":1721408535000}'),a={name:"插件/插件列表.md"},n=d("",2),o=[n];function u(l,y,h,s,i,c){return r(),e("div",null,o)}const m=t(a,[["render",u]]);export{f as __pageData,m as default}; diff --git "a/assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.D3RaU13F.js" "b/assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.SKMSpBW6.js" similarity index 84% rename from "assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.D3RaU13F.js" rename to "assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.SKMSpBW6.js" index a5f953c..8c8e818 100644 --- "a/assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.D3RaU13F.js" +++ "b/assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.SKMSpBW6.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/标签化管理.md","filePath":"插件/标签化管理.md","lastUpdated":1721405890000}'),r={name:"插件/标签化管理.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/标签化管理.md","filePath":"插件/标签化管理.md","lastUpdated":1721408535000}'),r={name:"插件/标签化管理.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.D3RaU13F.lean.js" "b/assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.SKMSpBW6.lean.js" similarity index 84% rename from "assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.D3RaU13F.lean.js" rename to "assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.SKMSpBW6.lean.js" index a5f953c..8c8e818 100644 --- "a/assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.D3RaU13F.lean.js" +++ "b/assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.SKMSpBW6.lean.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/标签化管理.md","filePath":"插件/标签化管理.md","lastUpdated":1721405890000}'),r={name:"插件/标签化管理.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/标签化管理.md","filePath":"插件/标签化管理.md","lastUpdated":1721408535000}'),r={name:"插件/标签化管理.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.c6V-2JPE.js" "b/assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.00QQ8nUD.js" similarity index 83% rename from "assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.c6V-2JPE.js" rename to "assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.00QQ8nUD.js" index 0980707..5d6963d 100644 --- "a/assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.c6V-2JPE.js" +++ "b/assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.00QQ8nUD.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/用例录屏.md","filePath":"插件/用例录屏.md","lastUpdated":1721405890000}'),r={name:"插件/用例录屏.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/用例录屏.md","filePath":"插件/用例录屏.md","lastUpdated":1721408535000}'),r={name:"插件/用例录屏.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.c6V-2JPE.lean.js" "b/assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.00QQ8nUD.lean.js" similarity index 83% rename from "assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.c6V-2JPE.lean.js" rename to "assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.00QQ8nUD.lean.js" index 0980707..5d6963d 100644 --- "a/assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.c6V-2JPE.lean.js" +++ "b/assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.00QQ8nUD.lean.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/用例录屏.md","filePath":"插件/用例录屏.md","lastUpdated":1721405890000}'),r={name:"插件/用例录屏.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/用例录屏.md","filePath":"插件/用例录屏.md","lastUpdated":1721408535000}'),r={name:"插件/用例录屏.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.sJoJ4bpH.js" "b/assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.BcEKWi6-.js" similarity index 84% rename from "assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.sJoJ4bpH.js" rename to "assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.BcEKWi6-.js" index 5a367b0..fb1d98d 100644 --- "a/assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.sJoJ4bpH.js" +++ "b/assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.BcEKWi6-.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/相对位移定位.md","filePath":"插件/相对位移定位.md","lastUpdated":1721405890000}'),r={name:"插件/相对位移定位.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/相对位移定位.md","filePath":"插件/相对位移定位.md","lastUpdated":1721408535000}'),r={name:"插件/相对位移定位.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.sJoJ4bpH.lean.js" "b/assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.BcEKWi6-.lean.js" similarity index 84% rename from "assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.sJoJ4bpH.lean.js" rename to "assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.BcEKWi6-.lean.js" index 5a367b0..fb1d98d 100644 --- "a/assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.sJoJ4bpH.lean.js" +++ "b/assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.BcEKWi6-.lean.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/相对位移定位.md","filePath":"插件/相对位移定位.md","lastUpdated":1721405890000}'),r={name:"插件/相对位移定位.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/相对位移定位.md","filePath":"插件/相对位移定位.md","lastUpdated":1721408535000}'),r={name:"插件/相对位移定位.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.BgPcOGr5.js" "b/assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.Cd0N2NjF.js" similarity index 83% rename from "assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.BgPcOGr5.js" rename to "assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.Cd0N2NjF.js" index 3ebada7..b0e5592 100644 --- "a/assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.BgPcOGr5.js" +++ "b/assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.Cd0N2NjF.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/键鼠操作.md","filePath":"插件/键鼠操作.md","lastUpdated":1721405890000}'),r={name:"插件/键鼠操作.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/键鼠操作.md","filePath":"插件/键鼠操作.md","lastUpdated":1721408535000}'),r={name:"插件/键鼠操作.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.BgPcOGr5.lean.js" "b/assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.Cd0N2NjF.lean.js" similarity index 83% rename from "assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.BgPcOGr5.lean.js" rename to "assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.Cd0N2NjF.lean.js" index 3ebada7..b0e5592 100644 --- "a/assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.BgPcOGr5.lean.js" +++ "b/assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.Cd0N2NjF.lean.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/键鼠操作.md","filePath":"插件/键鼠操作.md","lastUpdated":1721405890000}'),r={name:"插件/键鼠操作.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/键鼠操作.md","filePath":"插件/键鼠操作.md","lastUpdated":1721408535000}'),r={name:"插件/键鼠操作.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.CqvwfHwt.js" "b/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.1k7ez6Zn.js" similarity index 99% rename from "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.CqvwfHwt.js" rename to "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.1k7ez6Zn.js" index b96cb5f..af971a3 100644 --- "a/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.CqvwfHwt.js" +++ "b/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.1k7ez6Zn.js" @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as l}from"./chunks/framework.CoRJFuj9.js";const F=JSON.parse('{"title":"UOS 自动化测试方法套件(UMTK)","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试方法套件.md","filePath":"规划/UOS自动化测试方法套件.md","lastUpdated":1721405890000}'),e={name:"规划/UOS自动化测试方法套件.md"},n=l(`

    UOS 自动化测试方法套件(UMTK)

    1. 简介

    UOS 自动化测试方法套件,全称:UOS 系统自动化测试操作方法套件(UOS AutoTest Method ToolKit —— UMTK),以下简称测试方法套件,是基于 YouQu3 封装的 UOS 操作系统预装应用的元素操作方法套件。

    测试方法套件是一个独立项目,旨在提供系统预装应用所有的元素的操作方法,这些元素操作方法可以用于自动化用例调用,组装成自动化测试用例。

    2. 工程设计

    2.1. 工程结构

    shell
    uos-method-toolkit
    +import{_ as s,c as i,o as a,U as l}from"./chunks/framework.CoRJFuj9.js";const F=JSON.parse('{"title":"UOS 自动化测试方法套件(UMTK)","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试方法套件.md","filePath":"规划/UOS自动化测试方法套件.md","lastUpdated":1721408535000}'),e={name:"规划/UOS自动化测试方法套件.md"},n=l(`

    UOS 自动化测试方法套件(UMTK)

    1. 简介

    UOS 自动化测试方法套件,全称:UOS 系统自动化测试操作方法套件(UOS AutoTest Method ToolKit —— UMTK),以下简称测试方法套件,是基于 YouQu3 封装的 UOS 操作系统预装应用的元素操作方法套件。

    测试方法套件是一个独立项目,旨在提供系统预装应用所有的元素的操作方法,这些元素操作方法可以用于自动化用例调用,组装成自动化测试用例。

    2. 工程设计

    2.1. 工程结构

    shell
    uos-method-toolkit
     ├── LICENSE
     ├── README.md
     ├── tests
    diff --git "a/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.CqvwfHwt.lean.js" "b/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.1k7ez6Zn.lean.js"
    similarity index 88%
    rename from "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.CqvwfHwt.lean.js"
    rename to "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.1k7ez6Zn.lean.js"
    index 8032f7d..245af41 100644
    --- "a/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.CqvwfHwt.lean.js"
    +++ "b/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.1k7ez6Zn.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as l}from"./chunks/framework.CoRJFuj9.js";const F=JSON.parse('{"title":"UOS 自动化测试方法套件(UMTK)","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试方法套件.md","filePath":"规划/UOS自动化测试方法套件.md","lastUpdated":1721405890000}'),e={name:"规划/UOS自动化测试方法套件.md"},n=l("",26),t=[n];function p(h,k,d,o,r,c){return a(),i("div",null,t)}const g=s(e,[["render",p]]);export{F as __pageData,g as default};
    +import{_ as s,c as i,o as a,U as l}from"./chunks/framework.CoRJFuj9.js";const F=JSON.parse('{"title":"UOS 自动化测试方法套件(UMTK)","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试方法套件.md","filePath":"规划/UOS自动化测试方法套件.md","lastUpdated":1721408535000}'),e={name:"规划/UOS自动化测试方法套件.md"},n=l("",26),t=[n];function p(h,k,d,o,r,c){return a(),i("div",null,t)}const g=s(e,[["render",p]]);export{F as __pageData,g as default};
    diff --git "a/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.D-4hCLAP.js" "b/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.CjduEaF0.js"
    similarity index 99%
    rename from "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.D-4hCLAP.js"
    rename to "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.CjduEaF0.js"
    index adf6e16..adbf41c 100644
    --- "a/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.D-4hCLAP.js"
    +++ "b/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.CjduEaF0.js"
    @@ -1,4 +1,4 @@
    -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.CoRJFuj9.js";const o=JSON.parse('{"title":"UOS 自动化测试用例","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试用例.md","filePath":"规划/UOS自动化测试用例.md","lastUpdated":1721405890000}'),h={name:"规划/UOS自动化测试用例.md"},l=n(`

    UOS 自动化测试用例

    1. 简介

    UOS 自动化测试用例,以下简称测试用例,是基于 YouQu3 和 UMTK 编写的 UOS 系统级测试用例,旨在提供 UOS 系统所有预装应用的测试用例。

    2. 工程设计

    2.1. 工程结构

    shell
    uos-case
    +import{_ as s,c as i,o as a,U as n}from"./chunks/framework.CoRJFuj9.js";const o=JSON.parse('{"title":"UOS 自动化测试用例","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试用例.md","filePath":"规划/UOS自动化测试用例.md","lastUpdated":1721408535000}'),h={name:"规划/UOS自动化测试用例.md"},l=n(`

    UOS 自动化测试用例

    1. 简介

    UOS 自动化测试用例,以下简称测试用例,是基于 YouQu3 和 UMTK 编写的 UOS 系统级测试用例,旨在提供 UOS 系统所有预装应用的测试用例。

    2. 工程设计

    2.1. 工程结构

    shell
    uos-case
     ├── case 
     │   ├── base_case.py
     │   ├── dde_dock
    diff --git "a/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.D-4hCLAP.lean.js" "b/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.CjduEaF0.lean.js"
    similarity index 87%
    rename from "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.D-4hCLAP.lean.js"
    rename to "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.CjduEaF0.lean.js"
    index 55f4cb3..1cdd4ec 100644
    --- "a/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.D-4hCLAP.lean.js"
    +++ "b/assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.CjduEaF0.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.CoRJFuj9.js";const o=JSON.parse('{"title":"UOS 自动化测试用例","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试用例.md","filePath":"规划/UOS自动化测试用例.md","lastUpdated":1721405890000}'),h={name:"规划/UOS自动化测试用例.md"},l=n("",8),p=[l];function t(k,e,F,d,r,y){return a(),i("div",null,p)}const c=s(h,[["render",t]]);export{o as __pageData,c as default};
    +import{_ as s,c as i,o as a,U as n}from"./chunks/framework.CoRJFuj9.js";const o=JSON.parse('{"title":"UOS 自动化测试用例","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试用例.md","filePath":"规划/UOS自动化测试用例.md","lastUpdated":1721408535000}'),h={name:"规划/UOS自动化测试用例.md"},l=n("",8),p=[l];function t(k,e,F,d,r,y){return a(),i("div",null,p)}const c=s(h,[["render",t]]);export{o as __pageData,c as default};
    diff --git "a/assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.Cvwonfd9.js" "b/assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.B_QMqzr3.js"
    similarity index 99%
    rename from "assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.Cvwonfd9.js"
    rename to "assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.B_QMqzr3.js"
    index 761c882..0d4af14 100644
    --- "a/assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.Cvwonfd9.js"
    +++ "b/assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.B_QMqzr3.js"
    @@ -1,4 +1,4 @@
    -import{_ as s,c as i,o as a,U as l,ae as n,af as h}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"YouQu3 架构设计规划","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/YouQu3架构设计规划.md","filePath":"规划/YouQu3架构设计规划.md","lastUpdated":1721405890000}'),e={name:"规划/YouQu3架构设计规划.md"},t=l('

    YouQu3 架构设计规划

    1. 背景

    YouQu(YouQu2) 是 2021 年成都测试团队开始内部孵化的项目,旨在开发一个简单易用,功能强大的自动化测试框架。经过了 2 年多的持续开发优化,2023 年 8 月正式在 linuxdeepin 社区开源,2024 年 5 月在欧拉社区开源。从开源至今发布了 1.0 和 2.0 两个大版本,小版本更新了数十个。

    YouQu2 在公司内部已经被大量的自动化测试项目使用,在公司的多个自动化流程中运行得很好,能满足公司对自动化测试的业务需求,也得到了公司领导、同事们、内外部开发者们的认可。

    但 YouQu2 在现有框架下,仍然存在一些不尽人意的地方,比如:

    • 每次使用需要初始化框架工程及单独做环境部署,操作较为复杂;
    • 用例开发环境下更新版本不方便、源代码暴露在用户面前;
    • 导致框架代码容易被用户修改;
    • 绑定了太多公司的业务;
    • 一些底层模块或接口命名不优雅;
    • 对纯 CLI 操作系统环境支持不够友好;

    等等。

    有些问题处理起来必然会影响到框架的兼容性,势必对现有公司自动化用例、业务流程有一些影响,甚至有些问题在现有框架结构下根本无法解决,因此我们才萌生了对框架结构进行重新设计想法,我们想要设计开发一个更加简单易用、更加纯粹、扩展性和兼容性更好的自动化测试框架 —— YouQu3

    2. 目标

    YouQu3 旨在成为下一代 Linux 自动化测试框架,在继承 YouQu2 诸多亮点功能的同时解决其遇到的问题,同时对各功能进行插件化、模块化改造,全面优化框架接口调用机制。

    • 以 Python 包的形式提供框架能力,方便安装、更新。
    • 支持离线部署,用例整体打包交付之后,可以在无网络环境下直接运行。
    • 极致轻量化、可定制化依赖,可以根据测试项目类型安装对应的依赖。
    • 功能可插拔,以插件的形式提供功能,不安装插件的情况下框架也能正常运行。
    • 可视化配置,在浏览器中输入一些配置后即可驱动测试用例执行,搭配远程执行功能,可实现群控测试机执行。
    • 支持非开发者下运行,简化系统环境部署。

    价值:

    • 使用更简单方便,降低使用门槛。
    • 环境依赖可以一键打包交付,适合有离线部署需求的用户。
    • 安全性稳定性更好,提高用例开发效率,提高 CI/CD 运行稳定性。
    • 全面插件化模块化,功能扩展性更好。
    • 框架和插件库独立维护更新,互不影响。

    3. 架构设计

    3.1. 总体方案

    框架层提供总线服务,各功能以插件的方式接入,功能插件可插拔,由用例层决定使用哪些功能对应安装哪些插件,实现插件依赖的定制化。

    YouQu3 框架代码及插件库以 Python 三方包的形式提供,用例层直接 import 使用,框架源代码不直接呈现在用户面前,用户只需要关注用例、方法代码。

    框架提供驱动执行的命令,可以在通过命令行快速驱动测试用例执行,通过命令行参数控制,支持多种用例驱动模式,如:路径驱动、标签驱动、关键词驱动等等,执行模式支持本地驱动执行和远程驱动执行。

    框架也提供初始化用例工程的功能,一键生成用例工程模板代码,生成的用例工程遵循完整的 PO 设计模式,用例层、方法层基础代码自动生成,资源目录、Git 管理、环境依赖管理等相关功能的目录文件也都一键生成,让用户能专注于用例逻辑的编写和维护。

    3.2. 架构设计

    3.3. 整体数据流

    • 框架驱动命令传递命令行参数给执行管理器,执行管理器接收命令行参数并读取公共配置项驱动用例执行;

    • 用例执行过程中动态调用 YouQu3 底层功能,并动态加载 YouQu3 插件;

    • 若插件已经安装,则正常调用,否则提示用户进行安装,抛异常程序终止;

    • 用例执行完成后生成多种测试报告,并根据需要将测试结果,通过配置的接口进行数据回填。

    3.4. 详细设计

    详细描述各模块工作方式。

    3.4.1. 驱动执行管理

    框架提供驱动命令:youqu3,用于统一管理命令行参数驱动用例执行,驱动命令将命令行参数传递给框架底层 driver 模块(驱动),driver 获取命令行参数并结合配置项,解析测试策略,从而驱动测试用例执行。

    支持本地和远程执行模式:

    • 支持基于用例标签化管理驱动用例执行
    • 支持基于测试单驱动插件驱动用例执行
    • 支持基于关键词驱动用例执行
    • 支持用例目录或文件路径驱动执行

    3.4.2. 配置项管理

    YouQu3 配置项管理,采用命令行参数 + 公共配置的形式;

    • 命令行参数可以通过驱动命令提供入参选项,显示的传入参数值。
    • 公共配置为框架提供的一些具有默认值的配置项,原则上不通过修改配置文件的方式修改,可以通过系统环境变量或修改 setting 对象的属性值。
    • 用例工程配置模块建议继承 _Setting 配置类。
    • 不再提供 ini 配置文件管理配置项。

    3.4.3. 框架总线接口

    框架底层对各功能插件提供 插槽 中间件,插件如果已经安装,上层用例就能通过框架动态调用插件提供的功能,同时框架可以在中间件中对插件功能进行增强或修改。

    若插件没有被安装,框架可以正常运行,但若用例层调用了此插件提供的功能,此时会抛异常,并提示用户安装对应插件。

    3.4.4. 按测试类型管理插件

    框架的安装命令可以根据用例工程所属的测试类型,自动安装框架及改测试类型需要的插件依赖,不需要用户去了解和思考哪些插件适合哪种测试类型。

    3.4.5. 环境依赖管理

    采用虚拟环境管理依赖项,虚拟环境默认在用例功能根目录下创建,支持对依赖环境进行一键打包,也可以方便对虚拟环境的管理和维护。

    4. 用例工程设计

    用例工程支持一键创建:

    shell
    $ youqu3 init

    4.1. 用例工程结构

    shell
    autotest-my-case    # 用例工程名称
    +import{_ as s,c as i,o as a,U as l,ae as n,af as h}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"YouQu3 架构设计规划","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/YouQu3架构设计规划.md","filePath":"规划/YouQu3架构设计规划.md","lastUpdated":1721408535000}'),e={name:"规划/YouQu3架构设计规划.md"},t=l('

    YouQu3 架构设计规划

    1. 背景

    YouQu(YouQu2) 是 2021 年成都测试团队开始内部孵化的项目,旨在开发一个简单易用,功能强大的自动化测试框架。经过了 2 年多的持续开发优化,2023 年 8 月正式在 linuxdeepin 社区开源,2024 年 5 月在欧拉社区开源。从开源至今发布了 1.0 和 2.0 两个大版本,小版本更新了数十个。

    YouQu2 在公司内部已经被大量的自动化测试项目使用,在公司的多个自动化流程中运行得很好,能满足公司对自动化测试的业务需求,也得到了公司领导、同事们、内外部开发者们的认可。

    但 YouQu2 在现有框架下,仍然存在一些不尽人意的地方,比如:

    • 每次使用需要初始化框架工程及单独做环境部署,操作较为复杂;
    • 用例开发环境下更新版本不方便、源代码暴露在用户面前;
    • 导致框架代码容易被用户修改;
    • 绑定了太多公司的业务;
    • 一些底层模块或接口命名不优雅;
    • 对纯 CLI 操作系统环境支持不够友好;

    等等。

    有些问题处理起来必然会影响到框架的兼容性,势必对现有公司自动化用例、业务流程有一些影响,甚至有些问题在现有框架结构下根本无法解决,因此我们才萌生了对框架结构进行重新设计想法,我们想要设计开发一个更加简单易用、更加纯粹、扩展性和兼容性更好的自动化测试框架 —— YouQu3

    2. 目标

    YouQu3 旨在成为下一代 Linux 自动化测试框架,在继承 YouQu2 诸多亮点功能的同时解决其遇到的问题,同时对各功能进行插件化、模块化改造,全面优化框架接口调用机制。

    • 以 Python 包的形式提供框架能力,方便安装、更新。
    • 支持离线部署,用例整体打包交付之后,可以在无网络环境下直接运行。
    • 极致轻量化、可定制化依赖,可以根据测试项目类型安装对应的依赖。
    • 功能可插拔,以插件的形式提供功能,不安装插件的情况下框架也能正常运行。
    • 可视化配置,在浏览器中输入一些配置后即可驱动测试用例执行,搭配远程执行功能,可实现群控测试机执行。
    • 支持非开发者下运行,简化系统环境部署。

    价值:

    • 使用更简单方便,降低使用门槛。
    • 环境依赖可以一键打包交付,适合有离线部署需求的用户。
    • 安全性稳定性更好,提高用例开发效率,提高 CI/CD 运行稳定性。
    • 全面插件化模块化,功能扩展性更好。
    • 框架和插件库独立维护更新,互不影响。

    3. 架构设计

    3.1. 总体方案

    框架层提供总线服务,各功能以插件的方式接入,功能插件可插拔,由用例层决定使用哪些功能对应安装哪些插件,实现插件依赖的定制化。

    YouQu3 框架代码及插件库以 Python 三方包的形式提供,用例层直接 import 使用,框架源代码不直接呈现在用户面前,用户只需要关注用例、方法代码。

    框架提供驱动执行的命令,可以在通过命令行快速驱动测试用例执行,通过命令行参数控制,支持多种用例驱动模式,如:路径驱动、标签驱动、关键词驱动等等,执行模式支持本地驱动执行和远程驱动执行。

    框架也提供初始化用例工程的功能,一键生成用例工程模板代码,生成的用例工程遵循完整的 PO 设计模式,用例层、方法层基础代码自动生成,资源目录、Git 管理、环境依赖管理等相关功能的目录文件也都一键生成,让用户能专注于用例逻辑的编写和维护。

    3.2. 架构设计

    3.3. 整体数据流

    • 框架驱动命令传递命令行参数给执行管理器,执行管理器接收命令行参数并读取公共配置项驱动用例执行;

    • 用例执行过程中动态调用 YouQu3 底层功能,并动态加载 YouQu3 插件;

    • 若插件已经安装,则正常调用,否则提示用户进行安装,抛异常程序终止;

    • 用例执行完成后生成多种测试报告,并根据需要将测试结果,通过配置的接口进行数据回填。

    3.4. 详细设计

    详细描述各模块工作方式。

    3.4.1. 驱动执行管理

    框架提供驱动命令:youqu3,用于统一管理命令行参数驱动用例执行,驱动命令将命令行参数传递给框架底层 driver 模块(驱动),driver 获取命令行参数并结合配置项,解析测试策略,从而驱动测试用例执行。

    支持本地和远程执行模式:

    • 支持基于用例标签化管理驱动用例执行
    • 支持基于测试单驱动插件驱动用例执行
    • 支持基于关键词驱动用例执行
    • 支持用例目录或文件路径驱动执行

    3.4.2. 配置项管理

    YouQu3 配置项管理,采用命令行参数 + 公共配置的形式;

    • 命令行参数可以通过驱动命令提供入参选项,显示的传入参数值。
    • 公共配置为框架提供的一些具有默认值的配置项,原则上不通过修改配置文件的方式修改,可以通过系统环境变量或修改 setting 对象的属性值。
    • 用例工程配置模块建议继承 _Setting 配置类。
    • 不再提供 ini 配置文件管理配置项。

    3.4.3. 框架总线接口

    框架底层对各功能插件提供 插槽 中间件,插件如果已经安装,上层用例就能通过框架动态调用插件提供的功能,同时框架可以在中间件中对插件功能进行增强或修改。

    若插件没有被安装,框架可以正常运行,但若用例层调用了此插件提供的功能,此时会抛异常,并提示用户安装对应插件。

    3.4.4. 按测试类型管理插件

    框架的安装命令可以根据用例工程所属的测试类型,自动安装框架及改测试类型需要的插件依赖,不需要用户去了解和思考哪些插件适合哪种测试类型。

    3.4.5. 环境依赖管理

    采用虚拟环境管理依赖项,虚拟环境默认在用例功能根目录下创建,支持对依赖环境进行一键打包,也可以方便对虚拟环境的管理和维护。

    4. 用例工程设计

    用例工程支持一键创建:

    shell
    $ youqu3 init

    4.1. 用例工程结构

    shell
    autotest-my-case    # 用例工程名称
     ├── case    # 用例层目录
     │   ├── __init__.py
     │   ├── assert_res    # 断言资源
    diff --git "a/assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.Cvwonfd9.lean.js" "b/assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.B_QMqzr3.lean.js"
    similarity index 87%
    rename from "assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.Cvwonfd9.lean.js"
    rename to "assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.B_QMqzr3.lean.js"
    index 7d3e636..8a0a75b 100644
    --- "a/assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.Cvwonfd9.lean.js"
    +++ "b/assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.B_QMqzr3.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as l,ae as n,af as h}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"YouQu3 架构设计规划","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/YouQu3架构设计规划.md","filePath":"规划/YouQu3架构设计规划.md","lastUpdated":1721405890000}'),e={name:"规划/YouQu3架构设计规划.md"},t=l("",81),p=[t];function k(d,r,o,c,g,y){return a(),i("div",null,p)}const E=s(e,[["render",k]]);export{u as __pageData,E as default};
    +import{_ as s,c as i,o as a,U as l,ae as n,af as h}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"YouQu3 架构设计规划","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/YouQu3架构设计规划.md","filePath":"规划/YouQu3架构设计规划.md","lastUpdated":1721408535000}'),e={name:"规划/YouQu3架构设计规划.md"},t=l("",81),p=[t];function k(d,r,o,c,g,y){return a(),i("div",null,p)}const E=s(e,[["render",k]]);export{u as __pageData,E as default};
    diff --git a/hashmap.json b/hashmap.json
    index 1729e44..5f3c3c2 100644
    --- a/hashmap.json
    +++ b/hashmap.json
    @@ -1 +1 @@
    -{"index.md":"BAxrrnPv","指南_可选功能_远程交互控制.md":"D7Ub616Q","指南_环境管理_虚拟环境.md":"BM0wRiFv","规划_uos自动化测试用例.md":"D-4hCLAP","插件_用例录屏.md":"c6V-2JPE","插件_键鼠操作.md":"BgPcOGr5","指南_与生俱来_全自动日志.md":"BLUY55a-","指南_与生俱来_命令行交互.md":"BOp46UVp","插件_全自动日志.md":"BEwHeE6g","指南_与生俱来_标签化管理.md":"D6Anahcv","插件_ocr识别.md":"BmKTwhFO","插件_图像识别.md":"BPU6yt_e","指南_与生俱来_前后钩子.md":"B7qfwbgF","指南_可选功能_用例录屏.md":"qfjldP8y","插件_标签化管理.md":"D3RaU13F","实践_方法开发.md":"8tXxk_G9","指南_可选功能_html报告.md":"CH2tkTA8","指南_简介_快速开始.md":"CYgh_n0r","插件_dbus操控.md":"ym2kX19V","插件_webui自动化.md":"Ckc9aI7N","指南_与生俱来_动态等待.md":"BNp7qade","指南_驱动执行_远程执行.md":"4YLRDRlF","插件_相对位移定位.md":"sJoJ4bpH","插件_pms测试单驱动.md":"HcMsemJe","实践_用例开发.md":"BV_W8rlS","插件_属性识别.md":"BUlxFkty","指南_与生俱来_脚手架工具.md":"CIadOZoE","指南_可选功能_http自动化.md":"Cgbfk7sY","指南_与生俱来_json报告.md":"DhjgHtMS","指南_可选功能_其他插件.md":"DukfktyF","指南_驱动执行_自定义执行.md":"BMI8aDbA","指南_与生俱来_远程交互控制.md":"BuYkSeI0","指南_与生俱来_断言语句.md":"C_upRVFp","指南_可选功能_dbus自动化.md":"8Q1TXL_h","指南_驱动执行_本地执行.md":"BAPxDBnz","指南_简介_youqu3是什么.md":"SURc2hQV","插件_html测试报告.md":"BlaVBpz0","插件_插件列表.md":"C_KGzTAT","指南_可选功能_webui自动化.md":"B8SgVh3z","指南_可选功能_gui自动化.md":"BYBjR3nB","规划_uos自动化测试方法套件.md":"CqvwfHwt","指南_环境管理_原生环境.md":"NUJbTvDe","规划_youqu3架构设计规划.md":"Cvwonfd9"}
    +{"插件_pms测试单驱动.md":"C3RnWS9a","指南_可选功能_html报告.md":"BD0C2PLp","插件_webui自动化.md":"DYY4Enyl","实践_方法开发.md":"D5w4ani5","插件_用例录屏.md":"00QQ8nUD","指南_可选功能_webui自动化.md":"4tGdED5Q","插件_图像识别.md":"CUSgLZyr","指南_可选功能_其他插件.md":"UhOPKbmA","指南_可选功能_远程交互控制.md":"BJD86lKm","插件_键鼠操作.md":"Cd0N2NjF","插件_相对位移定位.md":"BcEKWi6-","index.md":"DHQYfbhW","指南_可选功能_用例录屏.md":"DggQ5HdS","指南_与生俱来_json报告.md":"DRi-K-t9","插件_html测试报告.md":"BO3ILMEt","插件_标签化管理.md":"SKMSpBW6","指南_与生俱来_前后钩子.md":"9jPcVsFG","指南_与生俱来_标签化管理.md":"DOd8Dpk9","指南_与生俱来_远程交互控制.md":"TCPCQR_v","插件_属性识别.md":"BIoism-O","指南_可选功能_gui自动化.md":"CEakJzU1","实践_用例开发.md":"EtGquKvU","插件_插件列表.md":"uvT93bNC","指南_简介_快速开始.md":"DgOYFTsc","指南_可选功能_http自动化.md":"ClcvJbXP","指南_环境管理_虚拟环境.md":"CYH44Dje","规划_uos自动化测试方法套件.md":"1k7ez6Zn","插件_ocr识别.md":"BbvIdL2A","指南_环境管理_原生环境.md":"DxExLQbF","指南_驱动执行_自定义执行.md":"CJzKfzmA","指南_简介_youqu3是什么.md":"Bua1hpcO","指南_与生俱来_动态等待.md":"LG1pIdT8","指南_与生俱来_脚手架工具.md":"DRa5p1HS","插件_dbus操控.md":"B46p_EM-","指南_与生俱来_全自动日志.md":"DAHkI26O","指南_驱动执行_本地执行.md":"D7xXXuqS","指南_可选功能_dbus自动化.md":"DAQ6P4eN","插件_全自动日志.md":"BybnXbQR","规划_uos自动化测试用例.md":"CjduEaF0","指南_驱动执行_远程执行.md":"tigHGXwZ","指南_与生俱来_命令行交互.md":"7SDsZBAk","规划_youqu3架构设计规划.md":"B_QMqzr3","指南_与生俱来_断言语句.md":"DYZkvVDK"}
    diff --git a/index.html b/index.html
    index 2e58906..7ece18c 100644
    --- a/index.html
    +++ b/index.html
    @@ -8,18 +8,18 @@
         
         
         
    -    
    +    
         
    -    
    +    
         
    -    
    +    
         
         
         
       
       
         
    Skip to content

    YouQu3

    Next-Gen Linux Autotest Framework

    让 Linux 自动化测试变得更简单

    YouQu3

    Contributors

    感谢以下所有人的贡献与参与

    - + \ No newline at end of file diff --git "a/\345\256\236\350\267\265/\346\226\271\346\263\225\345\274\200\345\217\221.html" "b/\345\256\236\350\267\265/\346\226\271\346\263\225\345\274\200\345\217\221.html" index 268da3e..a9e1eae 100644 --- "a/\345\256\236\350\267\265/\346\226\271\346\263\225\345\274\200\345\217\221.html" +++ "b/\345\256\236\350\267\265/\346\226\271\346\263\225\345\274\200\345\217\221.html" @@ -8,18 +8,18 @@ - + - + - + -
    Skip to content
    📔 阅读量:
    - +
    Skip to content
    📔 阅读量:
    + \ No newline at end of file diff --git "a/\345\256\236\350\267\265/\347\224\250\344\276\213\345\274\200\345\217\221.html" "b/\345\256\236\350\267\265/\347\224\250\344\276\213\345\274\200\345\217\221.html" index 55f4760..4866a3e 100644 --- "a/\345\256\236\350\267\265/\347\224\250\344\276\213\345\274\200\345\217\221.html" +++ "b/\345\256\236\350\267\265/\347\224\250\344\276\213\345\274\200\345\217\221.html" @@ -8,18 +8,18 @@ - + - + - + -
    Skip to content
    📔 阅读量:
    - +
    Skip to content
    📔 阅读量:
    + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/JSON\346\212\245\345\221\212.html" "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/JSON\346\212\245\345\221\212.html" index a9eb019..a04c140 100644 --- "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/JSON\346\212\245\345\221\212.html" +++ "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/JSON\346\212\245\345\221\212.html" @@ -8,11 +8,11 @@ - + - + - + @@ -75,8 +75,8 @@ "nodeid": "test_foo.py::TestFoo", "message": "cannot collect test class 'TestFoo' because it has a __init__ constructor" } -]
    - +]
+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.html" "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.html" index f10ad18..6ee139f 100644 --- "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.html" +++ "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.html" @@ -8,11 +8,11 @@ - + - + - + @@ -59,8 +59,8 @@ :return: """ element = tuple(map(lambda x: f"{Config.PIC_RES_PATH}/{x}", elements)) - return cls.find_image(*element, multiple=multiple)

调用方法时:

python
DfmWidget.find_app_image("dfm_001")

自动输出的日志:

bash
>> x86_64-uos-6: 02/28 17:48:47 | INFO  | logger: [find_app_image]: 查找图片 dfm_001.png 在屏幕中相似度大于 0.9 的坐标

加上装饰器 @log 之后,方法层所有的函数(包括实例方法、类方法、静态方法)都不需要再写日志代码,执行的时候会自动输出,并且所有调用的方法会以 allure.step 的方式,展示在 allure 报告中,在报告中更能一目了然的看到用例执行步骤。

日志模板语法

通过观察前面的例子,细心的同学可能还发现了一个小细节:函数功能说明中,两对大括号中的内容 作为变量输出出来了;

没错,这就是我们参考Djangojinja2 的模板语法设计出的日志模板语法,使用方法很简单,用两对大括号把函数的参数括起来,这样在日志输出的时候就能把调用函数时参数的值输出出来。

- + return cls.find_image(*element, multiple=multiple)

调用方法时:

python
DfmWidget.find_app_image("dfm_001")

自动输出的日志:

bash
>> x86_64-uos-6: 02/28 17:48:47 | INFO  | logger: [find_app_image]: 查找图片 dfm_001.png 在屏幕中相似度大于 0.9 的坐标

加上装饰器 @log 之后,方法层所有的函数(包括实例方法、类方法、静态方法)都不需要再写日志代码,执行的时候会自动输出,并且所有调用的方法会以 allure.step 的方式,展示在 allure 报告中,在报告中更能一目了然的看到用例执行步骤。

日志模板语法

通过观察前面的例子,细心的同学可能还发现了一个小细节:函数功能说明中,两对大括号中的内容 作为变量输出出来了;

没错,这就是我们参考Djangojinja2 的模板语法设计出的日志模板语法,使用方法很简单,用两对大括号把函数的参数括起来,这样在日志输出的时候就能把调用函数时参数的值输出出来。

+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\211\215\345\220\216\351\222\251\345\255\220.html" "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\211\215\345\220\216\351\222\251\345\255\220.html" index af37177..26fa50a 100644 --- "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\211\215\345\220\216\351\222\251\345\255\220.html" +++ "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\211\215\345\220\216\351\222\251\345\255\220.html" @@ -8,11 +8,11 @@ - + - + - + @@ -26,8 +26,8 @@ ├── case ├── method ├── job_end.py -...

后置命令行入参钩子

框架支持通过 --job-end 入参,参数值可以传递任意命令行命令,框架会在用例执行之前执行。

bash
youqu3 run --job-end "python3 do_what_you_want_do.py"

就像写 Shell 脚本一样即可:

bash
youqu3 run --job-end "sudo apt install htop;git clone ..."

- +...

后置命令行入参钩子

框架支持通过 --job-end 入参,参数值可以传递任意命令行命令,框架会在用例执行之前执行。

bash
youqu3 run --job-end "python3 do_what_you_want_do.py"

就像写 Shell 脚本一样即可:

bash
youqu3 run --job-end "sudo apt install htop;git clone ..."

+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\212\250\346\200\201\347\255\211\345\276\205.html" "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\212\250\346\200\201\347\255\211\345\276\205.html" index 33c2c62..b077f91 100644 --- "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\212\250\346\200\201\347\255\211\345\276\205.html" +++ "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\212\250\346\200\201\347\255\211\345\276\205.html" @@ -8,11 +8,11 @@ - + - + - + @@ -24,8 +24,8 @@ aarch64 = 1.5 loongarch64 = 2 mips64 = 2.5 -sw_64 = 2.5

元素识别动态等待

- +sw_64 = 2.5

元素识别动态等待

+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.html" "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.html" index 86ba3ad..5411267 100644 --- "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.html" +++ "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.html" @@ -8,11 +8,11 @@ - + - + - + @@ -34,8 +34,8 @@ RemoteCmd("user", "ip", "password").remote_sudo_run("apt install htop")

expect交互

python
from youqu3.cmd import RemoteCmd
 
 # TODO
-# RemoteCmd("user", "ip", "password").remote_expect_run("sudo apt install htop")
- +# RemoteCmd("user", "ip", "password").remote_expect_run("sudo apt install htop")
+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\226\255\350\250\200\350\257\255\345\217\245.html" "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\226\255\350\250\200\350\257\255\345\217\245.html" index 4dd8acc..0c11ac1 100644 --- "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\226\255\350\250\200\350\257\255\345\217\245.html" +++ "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\226\255\350\250\200\350\257\255\345\217\245.html" @@ -8,11 +8,11 @@ - + - + - + @@ -371,8 +371,8 @@ f"通过OCR识别到不应存在的文案:{dict(res)}", f"{pic if pic else setting.SCREEN_CACHE}", ) - )
- + )
+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.html" "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.html" index ad54e4f..eaf6a74 100644 --- "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.html" +++ "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.html" @@ -8,18 +8,18 @@ - + - + - + -
Skip to content
📔 阅读量:

标签化管理

使用说明

在 CSV 文件中写入标签:

脚本文件ID跳过原因确认修复废弃用例...
001skip-xxxfixed-xxxremoved-xxx...

CSV文件与脚本对应关系

  1. 在子项目目录下新建 CSV文件,用于保存用例标签,以 用例脚本的 py 文件去掉首字符串 "test_" ,去掉用例序号后的字符串,取中间的名称作为 csv 文件的文件名 。

举例

相册的用例文件为 test_album_001.py001 表示用例的ID(也可以是自定义的数字代表用例序号),此时 CSV 文件名就应为 album.csv

  1. 第 1 列脚本文件ID,从第 2 列之后的所有列都是一个用例标签,标签可以无序,可以随意新增。

特殊标签

跳过原因确认修复废弃用例是特殊的标签,后面会详细讲到

对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 CSV 文件,所有 CSV 文件建议放在一个 tags 目录下。

是否分模块维护取决于应用的用例复杂度,但标签化管理的核心目的是集中化管理用例的标签,因此若 CSV 文件太多了也是一个很糟糕的事情。

跳过用例

传统跳过用例的方式是在用例脚本里面给用例添加装饰器 (@pytest.mark.skip),解除跳过时将装饰器代码删掉,这种方式需要修改用例代码,而通过 csv 文件来管理跳过用例则会方便很多;

将跳过用例操作也整合进入用例标签,在 csv 文件中新增一列为“跳过原因”;

1. 固定跳过

示例:

脚本文件ID...(各种用例标签)跳过原因
679537...skip-受到某新需求影响
  • 如果应用受到新需求影响需要跳过,则在此列备注具体的跳过原因。跳过的原因统一标签开头为 “skip-XXX”;
  • 用例执行时判断 csv 文件里面跳过原因列是否存在跳过标签,存在跳过标签则用例也不会被执行,最终的用例状态会被标签为 SKIPED

2. 条件判断跳过

CSV 文件中,跳过原因一栏中填写为 “{函数名}-{参数}”。

某些用例会因为不同的环境判断用例是否执行,常见的场景为在不同架构上判断是否执行,例如:skipif_platform-aarch64

示例:

脚本文件ID...(各种用例标签)跳过原因
001...skipif_platform-aarch64&sw64
  • 跳过的原因标签为 “skipif_platform-” + 架构名,多个架构之间使用 “&” 拼接;
  • 判断当前架构是否为 arrch64 或者 sw64,若是,则跳过用例不执行;

内置支持的条件跳过对象:

跳过对象参数说明
skipif_platform(x86_64aarch64loogarch64sw64)架构跳过
skipif_not_platform(x86_64aarch64loogarch64sw64)架构不跳过
skipif_xdg_type(waylandx11)系统显示协议跳过
skipif_cpu_name/使用 sudo dmidecode -s system-product-name 查看机器的 cpu 型号 剔除中横线和 & 符号,
比如:KLVV-W5821,标签记录为 KLVVW5821
skipif_not_cpu_name/和上面逻辑相反

3.自定义跳过

在用例工程根目录下存放 skipif.py,自定义条件判断跳过的函数写在此文件中。

方法编写规范:

  • 方法名必须以 skipif 开头;
  • 方法必须有返回结果并且为布尔值(True 代表跳过,False 代表不跳过);
  • 方法只能有一个入参;

在用例收集阶段会以第一个 “-” 进行分割,截取的左侧字符串作为函数名,在 skipif.py 文件中查找是否有同名函数,并将截取的右侧作为参数传递给该函数,通过获取该函数返回的布尔值,返回 True,则用例不执行,返回 False,则执行该用例。

重要

  • 若函数需要多个参数,可自定义多个参数之间的连接符,连接符号不可使用下划线和逗号,推荐统一使用 & 符号;

  • 若需要多个 skipif 条件判断组合,使用 && 符号将两个方法分开,比如:skipif_platform-aarch64&&skipif_xdg_type-wayland

确认修复

针对于某些用例修复后,但不能立即删除跳过原因(skip-XXX)的用例,新增一列标签名为 “确认修复”,作为标记该用例是否已经修复,固定填入字段为 “fixed-已修复”。这样这条用例即使同时标记了 skip-XXX 也会正常执行。

示例:

用例ID...(各种用例标签)跳过原因确认修复
679537...skip-受到某新需求影响fixed-已修复

【同时标记了skipfixed,但仍然想要跳过用例】

当 “跳过原因” 和 “确认修复” 中同时填入后,命令行传递参数 --ifixed yes,则代码不会执行该条用例。

bash
python3 manage.py run --ifixed yes

废弃用例

针对某些用例,由于需求变更,环境影响或评估不再适用于自动化测试时,用例需要废弃,则新增一列标签名为 “废弃用例”,该列存在 “removed-{废弃原因}”,则用例不会执行。

用例ID...(各种用例标签)跳过原因确认修复废弃用例
679537...skip-受到某新需求影响fixed-已修复removed-已废弃

文件格式

此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。

- +
Skip to content
📔 阅读量:

标签化管理

使用说明

在 CSV 文件中写入标签:

脚本文件ID跳过原因确认修复废弃用例...
001skip-xxxfixed-xxxremoved-xxx...

CSV文件与脚本对应关系

  1. 在子项目目录下新建 CSV文件,用于保存用例标签,以 用例脚本的 py 文件去掉首字符串 "test_" ,去掉用例序号后的字符串,取中间的名称作为 csv 文件的文件名 。

举例

相册的用例文件为 test_album_001.py001 表示用例的ID(也可以是自定义的数字代表用例序号),此时 CSV 文件名就应为 album.csv

  1. 第 1 列脚本文件ID,从第 2 列之后的所有列都是一个用例标签,标签可以无序,可以随意新增。

特殊标签

跳过原因确认修复废弃用例是特殊的标签,后面会详细讲到

对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 CSV 文件,所有 CSV 文件建议放在一个 tags 目录下。

是否分模块维护取决于应用的用例复杂度,但标签化管理的核心目的是集中化管理用例的标签,因此若 CSV 文件太多了也是一个很糟糕的事情。

跳过用例

传统跳过用例的方式是在用例脚本里面给用例添加装饰器 (@pytest.mark.skip),解除跳过时将装饰器代码删掉,这种方式需要修改用例代码,而通过 csv 文件来管理跳过用例则会方便很多;

将跳过用例操作也整合进入用例标签,在 csv 文件中新增一列为“跳过原因”;

1. 固定跳过

示例:

脚本文件ID...(各种用例标签)跳过原因
679537...skip-受到某新需求影响
  • 如果应用受到新需求影响需要跳过,则在此列备注具体的跳过原因。跳过的原因统一标签开头为 “skip-XXX”;
  • 用例执行时判断 csv 文件里面跳过原因列是否存在跳过标签,存在跳过标签则用例也不会被执行,最终的用例状态会被标签为 SKIPED

2. 条件判断跳过

CSV 文件中,跳过原因一栏中填写为 “{函数名}-{参数}”。

某些用例会因为不同的环境判断用例是否执行,常见的场景为在不同架构上判断是否执行,例如:skipif_platform-aarch64

示例:

脚本文件ID...(各种用例标签)跳过原因
001...skipif_platform-aarch64&sw64
  • 跳过的原因标签为 “skipif_platform-” + 架构名,多个架构之间使用 “&” 拼接;
  • 判断当前架构是否为 arrch64 或者 sw64,若是,则跳过用例不执行;

内置支持的条件跳过对象:

跳过对象参数说明
skipif_platform(x86_64aarch64loogarch64sw64)架构跳过
skipif_not_platform(x86_64aarch64loogarch64sw64)架构不跳过
skipif_xdg_type(waylandx11)系统显示协议跳过
skipif_cpu_name/使用 sudo dmidecode -s system-product-name 查看机器的 cpu 型号 剔除中横线和 & 符号,
比如:KLVV-W5821,标签记录为 KLVVW5821
skipif_not_cpu_name/和上面逻辑相反

3.自定义跳过

在用例工程根目录下存放 skipif.py,自定义条件判断跳过的函数写在此文件中。

方法编写规范:

  • 方法名必须以 skipif 开头;
  • 方法必须有返回结果并且为布尔值(True 代表跳过,False 代表不跳过);
  • 方法只能有一个入参;

在用例收集阶段会以第一个 “-” 进行分割,截取的左侧字符串作为函数名,在 skipif.py 文件中查找是否有同名函数,并将截取的右侧作为参数传递给该函数,通过获取该函数返回的布尔值,返回 True,则用例不执行,返回 False,则执行该用例。

重要

  • 若函数需要多个参数,可自定义多个参数之间的连接符,连接符号不可使用下划线和逗号,推荐统一使用 & 符号;

  • 若需要多个 skipif 条件判断组合,使用 && 符号将两个方法分开,比如:skipif_platform-aarch64&&skipif_xdg_type-wayland

确认修复

针对于某些用例修复后,但不能立即删除跳过原因(skip-XXX)的用例,新增一列标签名为 “确认修复”,作为标记该用例是否已经修复,固定填入字段为 “fixed-已修复”。这样这条用例即使同时标记了 skip-XXX 也会正常执行。

示例:

用例ID...(各种用例标签)跳过原因确认修复
679537...skip-受到某新需求影响fixed-已修复

【同时标记了skipfixed,但仍然想要跳过用例】

当 “跳过原因” 和 “确认修复” 中同时填入后,命令行传递参数 --ifixed yes,则代码不会执行该条用例。

bash
python3 manage.py run --ifixed yes

废弃用例

针对某些用例,由于需求变更,环境影响或评估不再适用于自动化测试时,用例需要废弃,则新增一列标签名为 “废弃用例”,该列存在 “removed-{废弃原因}”,则用例不会执行。

用例ID...(各种用例标签)跳过原因确认修复废弃用例
679537...skip-受到某新需求影响fixed-已修复removed-已废弃

文件格式

此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。

+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.html" "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.html" index 66e50a8..3007e35 100644 --- "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.html" +++ "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" index f6a7a25..ef4b04e 100644 --- "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" +++ "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" @@ -8,11 +8,11 @@ - + - + - + @@ -45,8 +45,8 @@ user="uos", ip="10.8.7.55", password="1", - ).click_dde_file_manager_by_attr()
- + ).click_dde_file_manager_by_attr()
+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/DBus\350\207\252\345\212\250\345\214\226.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/DBus\350\207\252\345\212\250\345\214\226.html" index 00cdf5c..be84595 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/DBus\350\207\252\345\212\250\345\214\226.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/DBus\350\207\252\345\212\250\345\214\226.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/GUI\350\207\252\345\212\250\345\214\226.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/GUI\350\207\252\345\212\250\345\214\226.html" index 24407f9..dca4c84 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/GUI\350\207\252\345\212\250\345\214\226.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/GUI\350\207\252\345\212\250\345\214\226.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTML\346\212\245\345\221\212.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTML\346\212\245\345\221\212.html" index 0ad8c8d..ff039de 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTML\346\212\245\345\221\212.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTML\346\212\245\345\221\212.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTTP\350\207\252\345\212\250\345\214\226.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTTP\350\207\252\345\212\250\345\214\226.html" index 8d3ca02..d834cd8 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTTP\350\207\252\345\212\250\345\214\226.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTTP\350\207\252\345\212\250\345\214\226.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/WebUI\350\207\252\345\212\250\345\214\226.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/WebUI\350\207\252\345\212\250\345\214\226.html" index 3666239..f5e57a4 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/WebUI\350\207\252\345\212\250\345\214\226.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/WebUI\350\207\252\345\212\250\345\214\226.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\345\205\266\344\273\226\346\217\222\344\273\266.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\345\205\266\344\273\226\346\217\222\344\273\266.html" index 642c132..9c5f3a4 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\345\205\266\344\273\226\346\217\222\344\273\266.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\345\205\266\344\273\226\346\217\222\344\273\266.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\347\224\250\344\276\213\345\275\225\345\261\217.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\347\224\250\344\276\213\345\275\225\345\261\217.html" index f6dff03..d1bc1e8 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\347\224\250\344\276\213\345\275\225\345\261\217.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\347\224\250\344\276\213\345\275\225\345\261\217.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" index 522481b..7bc2ada 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\347\216\257\345\242\203\347\256\241\347\220\206/\345\216\237\347\224\237\347\216\257\345\242\203.html" "b/\346\214\207\345\215\227/\347\216\257\345\242\203\347\256\241\347\220\206/\345\216\237\347\224\237\347\216\257\345\242\203.html" index 5fcb854..f97792f 100644 --- "a/\346\214\207\345\215\227/\347\216\257\345\242\203\347\256\241\347\220\206/\345\216\237\347\224\237\347\216\257\345\242\203.html" +++ "b/\346\214\207\345\215\227/\347\216\257\345\242\203\347\256\241\347\220\206/\345\216\237\347\224\237\347\216\257\345\242\203.html" @@ -8,18 +8,18 @@ - + - + - + -
Skip to content
📔 阅读量:

原生环境

当系统中安装了 YouQu3 之后,会自动生成一个命令:youqu3

bash
youqu3 -h

你可以使用它进行用例的驱动执行和管理。

比如:

bash
youqu3 run
- +
Skip to content
📔 阅读量:

原生环境

当系统中安装了 YouQu3 之后,会自动生成一个命令:youqu3

bash
youqu3 -h

你可以使用它进行用例的驱动执行和管理。

比如:

bash
youqu3 run
+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\347\216\257\345\242\203\347\256\241\347\220\206/\350\231\232\346\213\237\347\216\257\345\242\203.html" "b/\346\214\207\345\215\227/\347\216\257\345\242\203\347\256\241\347\220\206/\350\231\232\346\213\237\347\216\257\345\242\203.html" index 9c5899f..245c1ad 100644 --- "a/\346\214\207\345\215\227/\347\216\257\345\242\203\347\256\241\347\220\206/\350\231\232\346\213\237\347\216\257\345\242\203.html" +++ "b/\346\214\207\345\215\227/\347\216\257\345\242\203\347\256\241\347\220\206/\350\231\232\346\213\237\347\216\257\345\242\203.html" @@ -8,19 +8,19 @@ - + - + - +
Skip to content
📔 阅读量:

虚拟环境

当系统中安装了 YouQu3 之后,会自动生成一个命令:youqu3

这个命令可以在系统原生环境中使用,它除了可以驱动用例执行,还可以进行环境的管理:

bash
youqu3 envx

子命令 envx 用于虚拟环境安装,执行之后会自动创建一些有用的命令:

命令说明
youqu3-cargo用例执行驱动的命令
youqu3-shell激活虚拟环境
youqu3-rm删除虚拟环境

youqu3-cargo

youqu3-cargo 可以自动加载虚拟环境并驱动用例工程:

bash
youqu3-cargo run

youqu3-shell

youqu3-shell 可以激活虚拟环境,由于虚拟环境中也安装了 YouQu3 ,因此你仍然可以在虚拟环境中使用命令:youqu3

bash
$ youqu3-shell
-(my_virtualenv)$ youqu3 run

youqu3-rm

youqu3-rm 命令可以将当前的虚拟环境删除。

- +(my_virtualenv)$ youqu3 run

youqu3-rm

youqu3-rm 命令可以将当前的虚拟环境删除。

+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\347\256\200\344\273\213/YouQu3\346\230\257\344\273\200\344\271\210.html" "b/\346\214\207\345\215\227/\347\256\200\344\273\213/YouQu3\346\230\257\344\273\200\344\271\210.html" index 5d5133a..447c759 100644 --- "a/\346\214\207\345\215\227/\347\256\200\344\273\213/YouQu3\346\230\257\344\273\200\344\271\210.html" +++ "b/\346\214\207\345\215\227/\347\256\200\344\273\213/YouQu3\346\230\257\344\273\200\344\271\210.html" @@ -8,18 +8,18 @@ - + - + - + -
Skip to content
📔 阅读量:

YouQu3

YouQu3

YouQu3, Next generation Linux automation testing framework.


YouQu3 旨在成为下一代 Linux 自动化测试框架,在继承 YouQu2 诸多亮点功能的同时解决其遇到的问题,同时对各功能进行插件化、模块化改造,全面优化框架接口调用机制。

  • 以包的形式提供框架能力,方便安装、更新。
  • 支持离线部署,用例整体打包交付之后,可以在无网络环境下直接运行。
  • 极致轻量化、可定制化依赖,可以根据测试项目类型安装对应的依赖。
  • 功能可插拔,以插件的形式提供功能,不安装插件的情况下框架也能正常运行。
  • 可视化配置,在浏览器中输入一些配置后即可驱动测试用例执行,搭配远程执行功能,可实现群控测试机执行。
  • 支持非开发者下运行,简化系统环境部署。

YouQu3 能做什么?

☑ 💻 Linux 桌面应用 UI 自动化测试

☑ 🌏 Web UI 自动化测试

☑ 🚌 Linux DBus 接口自动化测试

☑ 🚀 Linux 命令行自动化测试

☑ 🕷️ HTTP 接口自动化测试

☑ 🤙️ 。。。无限可能

- +
Skip to content
📔 阅读量:

YouQu3

YouQu3

YouQu3, Next generation Linux automation testing framework.


YouQu3 旨在成为下一代 Linux 自动化测试框架,在继承 YouQu2 诸多亮点功能的同时解决其遇到的问题,同时对各功能进行插件化、模块化改造,全面优化框架接口调用机制。

  • 以包的形式提供框架能力,方便安装、更新。
  • 支持离线部署,用例整体打包交付之后,可以在无网络环境下直接运行。
  • 极致轻量化、可定制化依赖,可以根据测试项目类型安装对应的依赖。
  • 功能可插拔,以插件的形式提供功能,不安装插件的情况下框架也能正常运行。
  • 可视化配置,在浏览器中输入一些配置后即可驱动测试用例执行,搭配远程执行功能,可实现群控测试机执行。
  • 支持非开发者下运行,简化系统环境部署。

YouQu3 能做什么?

☑ 💻 Linux 桌面应用 UI 自动化测试

☑ 🌏 Web UI 自动化测试

☑ 🚌 Linux DBus 接口自动化测试

☑ 🚀 Linux 命令行自动化测试

☑ 🕷️ HTTP 接口自动化测试

☑ 🤙️ 。。。无限可能

+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\347\256\200\344\273\213/\345\277\253\351\200\237\345\274\200\345\247\213.html" "b/\346\214\207\345\215\227/\347\256\200\344\273\213/\345\277\253\351\200\237\345\274\200\345\247\213.html" index 0a9de9e..3478ee2 100644 --- "a/\346\214\207\345\215\227/\347\256\200\344\273\213/\345\277\253\351\200\237\345\274\200\345\247\213.html" +++ "b/\346\214\207\345\215\227/\347\256\200\344\273\213/\345\277\253\351\200\237\345\274\200\345\247\213.html" @@ -8,19 +8,19 @@ - + - + - + -
Skip to content
📔 阅读量:

快速开始

安装

bash
pip install youqu3
bash
pip install "youqu3[gui]"
bash
pip install "youqu3[webui]"
bash
pip install "youqu3[dbus]"
bash
pip install "youqu3[http]"
bash
pip install "youqu3[remote]"

注意

  • 根据不同的测试类型选择以上不同的安装命令,可以自动安装对应的依赖集。
  • 基础环境默认支持 Linux 命令行自动化
  • 同时选择多个环境:pip install "youqu3[gui, webui]"

创建用例工程

创建一个目录

bash
mkdir my_autotest

使用脚手架功能创建用例工程

bash
cd my_autotest/
-youqu3 init

- +
Skip to content
📔 阅读量:

快速开始

安装

bash
pip install youqu3
bash
pip install "youqu3[gui]"
bash
pip install "youqu3[webui]"
bash
pip install "youqu3[http]"
bash
pip install "youqu3[remote]"

注意

  • 根据不同的测试类型选择以上不同的安装命令,可以自动安装对应的依赖集。
  • 基础环境默认支持 Linux 命令行自动化
  • 同时选择多个环境:pip install "youqu3[gui, webui]"

创建用例工程

创建一个目录

bash
mkdir my_autotest

使用脚手架功能创建用例工程

bash
cd my_autotest/
+youqu3 init

+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\346\234\254\345\234\260\346\211\247\350\241\214.html" "b/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\346\234\254\345\234\260\346\211\247\350\241\214.html" index 0b78398..718a0b1 100644 --- "a/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\346\234\254\345\234\260\346\211\247\350\241\214.html" +++ "b/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\346\234\254\345\234\260\346\211\247\350\241\214.html" @@ -8,17 +8,17 @@ - + - + - + -
Skip to content
📔 阅读量:

本地执行

子命令

本地执行子命令为:run

bash
$ youqu3 run
bash
$ youqu3-cargo run

用例驱动方式

执行所有用例

bash
$ youqu3 run
bash
$ youqu3-cargo run

指定执行某一个用例

python
# test_xxx_001.py
+    
Skip to content
📔 阅读量:

本地执行

子命令

本地执行子命令为:run

bash
$ youqu3 run
bash
$ youqu3-cargo run

用例驱动方式

执行所有用例

bash
$ youqu3 run
bash
$ youqu3-cargo run

指定执行某一个用例

python
# test_xxx_001.py
 
 class TestCase:
     
@@ -26,14 +26,14 @@
         ...
         
     def test_xxx_001_2(self):
-        ...

仅驱动执行这一条用例:

bash
$ youqu3 run -k test_xxx_001_1
bash
$ youqu3-cargo run -k test_xxx_001_1

如果你想执行这个 py 文件中所有的用例:

bash
$ youqu3 run -k test_xxx_001
bash
$ youqu3-cargo run -k test_xxx_001

指定某个目录执行

shell
autotest-my-app
+        ...

仅驱动执行这一条用例:

bash
$ youqu3 run -k test_xxx_001_1
bash
$ youqu3-cargo run -k test_xxx_001_1

如果你想执行这个 py 文件中所有的用例:

bash
$ youqu3 run -k test_xxx_001
bash
$ youqu3-cargo run -k test_xxx_001

指定某个目录执行

shell
autotest-my-app
 ├── case
 │   ├── base_case.py
 │   ├── __init__.py
 │   ├── smoke
 │  	├── test_mycase_001.py
-│  	└── test_mycase_002.py

驱动执行 smoke 目录下所有用例:

bash
$ youqu3 run -k smoke
bash
$ youqu3-cargo run -k smoke

根据关键词执行

执行包含关键词的用例,关键词可以是用例对象中的任意字符,且大小写不敏感

模块名称、py 文件名称、类名、函数名等等都可以做为关键词

比如:case/test_music_001.py::TestMusic::test_music_001

整个字符串中可以任意截取字符作为关键词。

关键词驱动支持 and/or/not 表达式。

bash
$ youqu3 run -k "music and 001"
bash
$ youqu3-cargo run -k "music and 001"

注意:

使用逻辑表达式的时候一定要加引号:"music and 001"

根据标签执行

基于 YouQu 特有的 CSV 文件管理的标签,也可以是传统的 Pytest 标签:@pytest.mark.L1

标签驱动支持 and/or/not 表达式。

bash
$ youqu3 run -t "L1 or smoke"
bash
$ youqu3-cargo run -t "L1 or smoke"

批量用例ID驱动执行

bash
$ youqu3 run -t "id1 or id2 or id3 or id4"
bash
$ youqu3-cargo run -t "id1 or id2 or id3 or id4"

注意:

使用逻辑表达式的时候一定要加引号:"id1 or id2 or id3 or id4"

指定用例文件路径执行

指定用例文件

bash
$ youqu3 run -f case/test_music_001.py
bash
$ youqu3-cargo run -f case/test_music_001.py

指定用例目录

bash
$ youqu3 run -f case
bash
$ youqu3-cargo run -f case

用例文件、目录组合

bash
$ youqu3 run -f "case/test_music_001.py case/test_music_002.py"
bash
$ youqu3-cargo run -f "case/test_music_001.py case/test_music_002.py"

注意:

多个用例文件、目录之间用空格分割,加引号

- +│   └── test_mycase_002.py

驱动执行 smoke 目录下所有用例:

bash
$ youqu3 run -k smoke
bash
$ youqu3-cargo run -k smoke

根据关键词执行

执行包含关键词的用例,关键词可以是用例对象中的任意字符,且大小写不敏感

模块名称、py 文件名称、类名、函数名等等都可以做为关键词

比如:case/test_music_001.py::TestMusic::test_music_001

整个字符串中可以任意截取字符作为关键词。

关键词驱动支持 and/or/not 表达式。

bash
$ youqu3 run -k "music and 001"
bash
$ youqu3-cargo run -k "music and 001"

注意:

使用逻辑表达式的时候一定要加引号:"music and 001"

根据标签执行

基于 YouQu 特有的 CSV 文件管理的标签,也可以是传统的 Pytest 标签:@pytest.mark.L1

标签驱动支持 and/or/not 表达式。

bash
$ youqu3 run -t "L1 or smoke"
bash
$ youqu3-cargo run -t "L1 or smoke"

批量用例ID驱动执行

bash
$ youqu3 run -t "id1 or id2 or id3 or id4"
bash
$ youqu3-cargo run -t "id1 or id2 or id3 or id4"

注意:

使用逻辑表达式的时候一定要加引号:"id1 or id2 or id3 or id4"

指定用例文件路径执行

指定用例文件

bash
$ youqu3 run -f case/test_music_001.py
bash
$ youqu3-cargo run -f case/test_music_001.py

指定用例目录

bash
$ youqu3 run -f case
bash
$ youqu3-cargo run -f case

用例文件、目录组合

bash
$ youqu3 run -f "case/test_music_001.py case/test_music_002.py"
bash
$ youqu3-cargo run -f "case/test_music_001.py case/test_music_002.py"

注意:

多个用例文件、目录之间用空格分割,加引号

+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.html" "b/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.html" index 83e0690..c0950d6 100644 --- "a/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.html" +++ "b/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.html" @@ -8,18 +8,18 @@ - + - + - + -
Skip to content
📔 阅读量:

自定义执行

YouQu3 支持在 txt 文件中自定义用例集驱动执行:

  • youqu-tags.txt
  • youqu-keywords.txt

youqu-tags.txt

在根目录下定义 youqu-tags.txt 文件,YouQu3 会自动加载并执行。

youqu-tags.txt 文件里面写标签的表达式,如:

youqu-tags.txt

id1 or id2 or id3

youqu-keywords.txt

- +
Skip to content
📔 阅读量:

自定义执行

YouQu3 支持在 txt 文件中自定义用例集驱动执行:

  • youqu-tags.txt
  • youqu-keywords.txt

youqu-tags.txt

在根目录下定义 youqu-tags.txt 文件,YouQu3 会自动加载并执行。

youqu-tags.txt 文件里面写标签的表达式,如:

youqu-tags.txt

id1 or id2 or id3

youqu-keywords.txt

+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\350\277\234\347\250\213\346\211\247\350\241\214.html" "b/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\350\277\234\347\250\213\346\211\247\350\241\214.html" index 38b0f0b..204adad 100644 --- "a/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\350\277\234\347\250\213\346\211\247\350\241\214.html" +++ "b/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\350\277\234\347\250\213\346\211\247\350\241\214.html" @@ -8,18 +8,18 @@ - + - + - + -
Skip to content
📔 阅读量:

远程执行

子命令

远程执行就是用本地作为服务端控制远程机器执行,远程机器执行的用例相同;

远程执行使用子命令: remote

bash
$ youqu3 remote -e
bash
$ youqu3-cargo remote -e
开启 SSH

执行前确保远程机器已经开启了 SSH 服务,否则会提示无法连接:

bash
$ sudo systemctl restart ssh

远程测试机分组策略

分组规则

一对大括号表示一个组:

txt
{user1@ip1/user2@ip2}{user3@ip3/user4@ip4}

以上写法表示有 2 个组(group):

  • group1 : user1@ip1/user2@ip2
  • group2 : user3@ip3/user4@ip4

执行策略

规则概述

同一组内瓜分执行,不同组之间相同执行

bash
$ youqu3 remote -c "{user1@ip1/user2@ip2}{user3@ip3/user4@ip4}"
bash
$ youqu3-cargo remote -c "{user1@ip1/user2@ip2}{user3@ip3/user4@ip4}"

假设总共 100 条用例:

  • group1group2同时执行 100 条
  • group1 包含 2 个测试机,2 个机器瓜分 100 条用例,每个机器执行 50 条
- +
Skip to content
📔 阅读量:

远程执行

子命令

远程执行就是用本地作为服务端控制远程机器执行,远程机器执行的用例相同;

远程执行使用子命令: remote

bash
$ youqu3 remote -e
bash
$ youqu3-cargo remote -e
开启 SSH

执行前确保远程机器已经开启了 SSH 服务,否则会提示无法连接:

bash
$ sudo systemctl restart ssh

远程测试机分组策略

分组规则

一对大括号表示一个组:

txt
{user1@ip1/user2@ip2}{user3@ip3/user4@ip4}

以上写法表示有 2 个组(group):

  • group1 : user1@ip1/user2@ip2
  • group2 : user3@ip3/user4@ip4

执行策略

规则概述

同一组内瓜分执行,不同组之间相同执行

bash
$ youqu3 remote -c "{user1@ip1/user2@ip2}{user3@ip3/user4@ip4}"
bash
$ youqu3-cargo remote -c "{user1@ip1/user2@ip2}{user3@ip3/user4@ip4}"

假设总共 100 条用例:

  • group1group2同时执行 100 条
  • group1 包含 2 个测试机,2 个机器瓜分 100 条用例,每个机器执行 50 条
+ \ No newline at end of file diff --git "a/\346\217\222\344\273\266/DBus\346\223\215\346\216\247.html" "b/\346\217\222\344\273\266/DBus\346\223\215\346\216\247.html" index 9448f33..ae3568a 100644 --- "a/\346\217\222\344\273\266/DBus\346\223\215\346\216\247.html" +++ "b/\346\217\222\344\273\266/DBus\346\223\215\346\216\247.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\217\222\344\273\266/Html\346\265\213\350\257\225\346\212\245\345\221\212.html" "b/\346\217\222\344\273\266/Html\346\265\213\350\257\225\346\212\245\345\221\212.html" index e5f7b13..230d500 100644 --- "a/\346\217\222\344\273\266/Html\346\265\213\350\257\225\346\212\245\345\221\212.html" +++ "b/\346\217\222\344\273\266/Html\346\265\213\350\257\225\346\212\245\345\221\212.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\217\222\344\273\266/OCR\350\257\206\345\210\253.html" "b/\346\217\222\344\273\266/OCR\350\257\206\345\210\253.html" index 796ade9..65651a0 100644 --- "a/\346\217\222\344\273\266/OCR\350\257\206\345\210\253.html" +++ "b/\346\217\222\344\273\266/OCR\350\257\206\345\210\253.html" @@ -8,11 +8,11 @@ - + - + - + @@ -32,8 +32,8 @@ setting.SERVER_IP = "192.168.0.1" setting.PORT = 8888 -OCR.ocr()

自动识别当前整个屏幕的所有内容。

2.2、指定某张图片识别的所有文字内容

python
OCR.ocr(picture_abspath="~/Desktop/test.png")

返回识别图片 test.png 的内容。

2.3、在全屏指定查找某个字符串的坐标

python
OCR.ocr("天天向上")

返回当前屏幕中,“天天向上”的坐标,如果存在多个,则返回一个字典。

2.4、指定某张图片查找某个字符串的坐标

python
OCR.ocr("天天向上"picture_abspath="~/Desktop/test.png")

2.5、其他参数

  • 识别语言

    lang: ch, en, fr, german, korean, japan

    默认为ch,中文,如果要修改识别语言;

    python
    OCR.ocr(lang="ch")
  • 匹配度

    similarity: float

    默认为0.6,可以修改为从0到1的数;

    shell
    OCR.ocr(similarity=0.1)
  • 返回原始数据

    return_default: bool

    默认为False,即默认返回识别到字符串的中心坐标,True表示返回原始数据;

    python
    OCR.ocr(return_default=False)
  • 只返回第一个

    return_first: bool

    当传入要查找的字符串时,可能存在当前屏幕中有多个目标;

    默认情况下是会将识别到的多个目标组装成字典返回;

    return_first=True 表示返回识别到的第一个。

    python
    OCR.ocr(return_first=True )
- +OCR.ocr()

自动识别当前整个屏幕的所有内容。

2.2、指定某张图片识别的所有文字内容

python
OCR.ocr(picture_abspath="~/Desktop/test.png")

返回识别图片 test.png 的内容。

2.3、在全屏指定查找某个字符串的坐标

python
OCR.ocr("天天向上")

返回当前屏幕中,“天天向上”的坐标,如果存在多个,则返回一个字典。

2.4、指定某张图片查找某个字符串的坐标

python
OCR.ocr("天天向上"picture_abspath="~/Desktop/test.png")

2.5、其他参数

  • 识别语言

    lang: ch, en, fr, german, korean, japan

    默认为ch,中文,如果要修改识别语言;

    python
    OCR.ocr(lang="ch")
  • 匹配度

    similarity: float

    默认为0.6,可以修改为从0到1的数;

    shell
    OCR.ocr(similarity=0.1)
  • 返回原始数据

    return_default: bool

    默认为False,即默认返回识别到字符串的中心坐标,True表示返回原始数据;

    python
    OCR.ocr(return_default=False)
  • 只返回第一个

    return_first: bool

    当传入要查找的字符串时,可能存在当前屏幕中有多个目标;

    默认情况下是会将识别到的多个目标组装成字典返回;

    return_first=True 表示返回识别到的第一个。

    python
    OCR.ocr(return_first=True )
+ \ No newline at end of file diff --git "a/\346\217\222\344\273\266/PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.html" "b/\346\217\222\344\273\266/PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.html" index 40178f3..07017a8 100644 --- "a/\346\217\222\344\273\266/PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.html" +++ "b/\346\217\222\344\273\266/PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.html" @@ -8,18 +8,18 @@ - + - + - + -
Skip to content
📔 阅读量:
- +
Skip to content
📔 阅读量:
+ \ No newline at end of file diff --git "a/\346\217\222\344\273\266/WebUI\350\207\252\345\212\250\345\214\226.html" "b/\346\217\222\344\273\266/WebUI\350\207\252\345\212\250\345\214\226.html" index e8a2735..e94bc75 100644 --- "a/\346\217\222\344\273\266/WebUI\350\207\252\345\212\250\345\214\226.html" +++ "b/\346\217\222\344\273\266/WebUI\350\207\252\345\212\250\345\214\226.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\217\222\344\273\266/\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.html" "b/\346\217\222\344\273\266/\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.html" index 907c11c..571b813 100644 --- "a/\346\217\222\344\273\266/\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.html" +++ "b/\346\217\222\344\273\266/\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.html" @@ -8,11 +8,11 @@ - + - + - + @@ -140,8 +140,8 @@ setting.LOG_LEVEL = "INFO"
  • 自动输出日志的类名称;(tuple)

    • CLASS_NAME_STARTSWITH 类名以什么开头;

      python
      from funnylog.conf import setting
       
       setting.CLASS_NAME_STARTSWITH = ("Test",) 
      -# 注意给元组类型
    • CLASS_NAME_ENDSWITH 类名以什么结尾;

    • CLASS_NAME_CONTAIN 类名包含什么字符;

  • - +# 注意给元组类型
  • CLASS_NAME_ENDSWITH 类名以什么结尾;

  • CLASS_NAME_CONTAIN 类名包含什么字符;

  • + \ No newline at end of file diff --git "a/\346\217\222\344\273\266/\345\233\276\345\203\217\350\257\206\345\210\253.html" "b/\346\217\222\344\273\266/\345\233\276\345\203\217\350\257\206\345\210\253.html" index c139a7a..df28b7f 100644 --- "a/\346\217\222\344\273\266/\345\233\276\345\203\217\350\257\206\345\210\253.html" +++ "b/\346\217\222\344\273\266/\345\233\276\345\203\217\350\257\206\345\210\253.html" @@ -8,18 +8,18 @@ - + - + - + -
    Skip to content
    📔 阅读量:
    - +
    Skip to content
    📔 阅读量:
    + \ No newline at end of file diff --git "a/\346\217\222\344\273\266/\345\261\236\346\200\247\350\257\206\345\210\253.html" "b/\346\217\222\344\273\266/\345\261\236\346\200\247\350\257\206\345\210\253.html" index 7fe512c..e41bbd2 100644 --- "a/\346\217\222\344\273\266/\345\261\236\346\200\247\350\257\206\345\210\253.html" +++ "b/\346\217\222\344\273\266/\345\261\236\346\200\247\350\257\206\345\210\253.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\217\222\344\273\266/\346\217\222\344\273\266\345\210\227\350\241\250.html" "b/\346\217\222\344\273\266/\346\217\222\344\273\266\345\210\227\350\241\250.html" index c13c5a2..5687192 100644 --- "a/\346\217\222\344\273\266/\346\217\222\344\273\266\345\210\227\350\241\250.html" +++ "b/\346\217\222\344\273\266/\346\217\222\344\273\266\345\210\227\350\241\250.html" @@ -8,18 +8,18 @@ - + - + - + -
    Skip to content
    📔 阅读量:

    YouQu3 插件汇总信息

    NUMNAMEDESCUSABLE
    1youqu-dogtail属性定位插件✔️
    2youqu-imagecenter-rpc基于 RPC 服务的图像识别插件✔️
    3youqu-mousekey键鼠操作插件✔️
    4pydbussendD-Bus 操控插件✔️
    5youqu-pms-driverPMS 测试单驱动插件✔️
    6youqu-button-center相对位移定位插件✔️
    7pytest-mark-manage用例标签化管理插件✔️
    8pytest-youqu-playwright基于 Playwright 的 Web UI 自动化插件✔️
    9youqu-htmlYouQu Html Report✔️
    10pytest-record-video用例失败录屏插件✔️
    11funnylog2全自动日志插件✔️
    12pdocr-rpc基于 RPC 服务的 OCR 识别插件✔️
    13wdotoolWayland 下完美的键鼠工具🚧
    14youqu-git-commit自动统计分析每次 Commit 中用例增删改、方法增删改的详细数据🚧
    15pylinuxauto 🔥Linux GUI 自动化测试模块✔️
    16youqu2-transfer-youqu3迁移工具:将基于YouQu2的用例代码修改为YouQu3✔️
    17youqu3-dragonYouQu3 Web 可视化驱动🚧
    - +
    Skip to content
    📔 阅读量:

    YouQu3 插件汇总信息

    NUMNAMEDESCUSABLE
    1youqu-dogtail属性定位插件✔️
    2youqu-imagecenter-rpc基于 RPC 服务的图像识别插件✔️
    3youqu-mousekey键鼠操作插件✔️
    4pydbussendD-Bus 操控插件✔️
    5youqu-pms-driverPMS 测试单驱动插件✔️
    6youqu-button-center相对位移定位插件✔️
    7pytest-mark-manage用例标签化管理插件✔️
    8pytest-youqu-playwright基于 Playwright 的 Web UI 自动化插件✔️
    9youqu-htmlYouQu Html Report✔️
    10pytest-record-video用例失败录屏插件✔️
    11funnylog2全自动日志插件✔️
    12pdocr-rpc基于 RPC 服务的 OCR 识别插件✔️
    13wdotoolWayland 下完美的键鼠工具🚧
    14youqu-git-commit自动统计分析每次 Commit 中用例增删改、方法增删改的详细数据🚧
    15pylinuxauto 🔥Linux GUI 自动化测试模块✔️
    16youqu2-transfer-youqu3迁移工具:将基于YouQu2的用例代码修改为YouQu3✔️
    17youqu3-dragonYouQu3 Web 可视化驱动🚧
    + \ No newline at end of file diff --git "a/\346\217\222\344\273\266/\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.html" "b/\346\217\222\344\273\266/\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.html" index f4a8cf4..a7889ce 100644 --- "a/\346\217\222\344\273\266/\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.html" +++ "b/\346\217\222\344\273\266/\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\217\222\344\273\266/\347\224\250\344\276\213\345\275\225\345\261\217.html" "b/\346\217\222\344\273\266/\347\224\250\344\276\213\345\275\225\345\261\217.html" index 1823628..4631829 100644 --- "a/\346\217\222\344\273\266/\347\224\250\344\276\213\345\275\225\345\261\217.html" +++ "b/\346\217\222\344\273\266/\347\224\250\344\276\213\345\275\225\345\261\217.html" @@ -8,18 +8,18 @@ - + - + - + - - + + \ No newline at end of file diff --git "a/\346\217\222\344\273\266/\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.html" "b/\346\217\222\344\273\266/\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.html" index fd7162c..ad96b43 100644 --- "a/\346\217\222\344\273\266/\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.html" +++ "b/\346\217\222\344\273\266/\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.html" @@ -8,18 +8,18 @@ - + - + - + -
    Skip to content
    📔 阅读量:
    - +
    Skip to content
    📔 阅读量:
    + \ No newline at end of file diff --git "a/\346\217\222\344\273\266/\351\224\256\351\274\240\346\223\215\344\275\234.html" "b/\346\217\222\344\273\266/\351\224\256\351\274\240\346\223\215\344\275\234.html" index 20f637f..e50c073 100644 --- "a/\346\217\222\344\273\266/\351\224\256\351\274\240\346\223\215\344\275\234.html" +++ "b/\346\217\222\344\273\266/\351\224\256\351\274\240\346\223\215\344\275\234.html" @@ -8,18 +8,18 @@ - + - + - + -
    Skip to content
    📔 阅读量:
    - +
    Skip to content
    📔 阅读量:
    + \ No newline at end of file diff --git "a/\350\247\204\345\210\222/UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.html" "b/\350\247\204\345\210\222/UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.html" index dabe1d3..df6eb11 100644 --- "a/\350\247\204\345\210\222/UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.html" +++ "b/\350\247\204\345\210\222/UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.html" @@ -8,11 +8,11 @@ - + - + - + @@ -32,8 +32,8 @@ ├── deepin_movie │   ├── deepin_music_method.py ... ... - └── __init__.py

    2.2. 方案说明

    • 系统中各应用划分自己的模块,模块名称为应用包名,下划线连接单词。

    • 每个应用存在一个唯一的出口文件,供外部用例调用。

      python
      from umtk.dde_file_manager import DdeFileManagerMethod

      DdeFileManagerMethod 可以调用 dde-file-manager 所有的元素操作方法。

    • 所有方法以类的形式编写,遵循 PO 设计模式。

    • 测试方法套件中所有的方法均为原子操作,不做复杂步骤的封装。

    3. 套件发布

    • 套件分大版本发布,比如 V20、V25 是不同的测试方法套件版本,在不同的代码仓库中。

    • 在同一个大版本中,套件持续保持更新,并在系统关键节点发布对应的版本;

      比如 V20 阶段,1070 发布一个套件版本,1071 发布一个套件版本,以此类推,过程中如果根据需要出小版本。

    • 套件通过 PyPI 发布,用户可直接通过 pip 命令安装使用:

      安装:

      shell
      pip install umtk

      使用:

      python
      from umtk.dde_file_manager import DdeFileManagerMethod

    4. 套件维护

    • 套件由专人主责维护(maintainer),其他人可以提需求、issue、PR,以保持套件的各方面一致性。

    • 鼓励内外部开发者贡献 PR。

    5. 对套件的测试

    套件里面保存元素的操作方法,在操作方法多了之后,维护方法的稳定性有效性将成为一个问题。

    因此,我们需要建立对套件的自动化测试,专门针对元素操作方法函数进行测试,类似于单元测试。

    适配厂商可以直接使用这些单元测试进行适配测试。

    6. UMTK 和 YouQu2 的公共方法库(public)有何区别

    孔子《论语·卫灵公》: “道,不同,不相为谋。”

    亦各从其志也。

    使用的框架不同

    • YouQu2 的公共方法库(public)是在 YouQu2 的框架下进行开发的,它不能脱离 YouQu2 框架而独立使用。
    • UMTK 是基于 YouQu3 开发,YouQu3 采用全新的架构设计,和 YouQu2 有很大差异,因此 UMTK 和 public 二者属于两个时代,不兼容。

    内容、范围、业务不同

    • UMTK 涵盖了 UOS 系统所有预装应用的原子操作方法,不存在复杂步骤的堆叠封装,不受需求变更影响,不涉及用例逻辑,可以对外开源发布。
    • public 仅包含自动化用例用到的少部分公共方法,范围覆盖很少,且存在较多涉及用例逻辑的复杂步骤方法,容易受到需求变更,不适合对外开源发布。

    代码一致性

    • UMTK 所有代码由专人维护,且有完善的单元测试机制,确保操作方法的一致性、稳定性、有效性。
    • public 大量人员都可以对其进行直接修改,各种代码风格不统一,稳定性、有效性没有保障。
    - + └── __init__.py

    2.2. 方案说明

    • 系统中各应用划分自己的模块,模块名称为应用包名,下划线连接单词。

    • 每个应用存在一个唯一的出口文件,供外部用例调用。

      python
      from umtk.dde_file_manager import DdeFileManagerMethod

      DdeFileManagerMethod 可以调用 dde-file-manager 所有的元素操作方法。

    • 所有方法以类的形式编写,遵循 PO 设计模式。

    • 测试方法套件中所有的方法均为原子操作,不做复杂步骤的封装。

    3. 套件发布

    • 套件分大版本发布,比如 V20、V25 是不同的测试方法套件版本,在不同的代码仓库中。

    • 在同一个大版本中,套件持续保持更新,并在系统关键节点发布对应的版本;

      比如 V20 阶段,1070 发布一个套件版本,1071 发布一个套件版本,以此类推,过程中如果根据需要出小版本。

    • 套件通过 PyPI 发布,用户可直接通过 pip 命令安装使用:

      安装:

      shell
      pip install umtk

      使用:

      python
      from umtk.dde_file_manager import DdeFileManagerMethod

    4. 套件维护

    • 套件由专人主责维护(maintainer),其他人可以提需求、issue、PR,以保持套件的各方面一致性。

    • 鼓励内外部开发者贡献 PR。

    5. 对套件的测试

    套件里面保存元素的操作方法,在操作方法多了之后,维护方法的稳定性有效性将成为一个问题。

    因此,我们需要建立对套件的自动化测试,专门针对元素操作方法函数进行测试,类似于单元测试。

    适配厂商可以直接使用这些单元测试进行适配测试。

    6. UMTK 和 YouQu2 的公共方法库(public)有何区别

    孔子《论语·卫灵公》: “道,不同,不相为谋。”

    亦各从其志也。

    使用的框架不同

    • YouQu2 的公共方法库(public)是在 YouQu2 的框架下进行开发的,它不能脱离 YouQu2 框架而独立使用。
    • UMTK 是基于 YouQu3 开发,YouQu3 采用全新的架构设计,和 YouQu2 有很大差异,因此 UMTK 和 public 二者属于两个时代,不兼容。

    内容、范围、业务不同

    • UMTK 涵盖了 UOS 系统所有预装应用的原子操作方法,不存在复杂步骤的堆叠封装,不受需求变更影响,不涉及用例逻辑,可以对外开源发布。
    • public 仅包含自动化用例用到的少部分公共方法,范围覆盖很少,且存在较多涉及用例逻辑的复杂步骤方法,容易受到需求变更,不适合对外开源发布。

    代码一致性

    • UMTK 所有代码由专人维护,且有完善的单元测试机制,确保操作方法的一致性、稳定性、有效性。
    • public 大量人员都可以对其进行直接修改,各种代码风格不统一,稳定性、有效性没有保障。
    + \ No newline at end of file diff --git "a/\350\247\204\345\210\222/UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.html" "b/\350\247\204\345\210\222/UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.html" index c182a35..f1bae76 100644 --- "a/\350\247\204\345\210\222/UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.html" +++ "b/\350\247\204\345\210\222/UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.html" @@ -8,11 +8,11 @@ - + - + - + @@ -43,8 +43,8 @@ ├── pytest.ini ├── README.md └── requirements.txt

    2.2. 方案说明

    • 系统中各应用在 case 目录下划分自己的用例模块,模块名称为应用包名,下划线连接单词。

    • 用例中所需要的方法从 UMTK 里面导入使用,如果涉及到复杂步骤的封装,可以在方法层(method)做复杂步骤的封装。

      python
      from umtk.dde_file_manager import DdeFileManagerMethod
      -from youqu3.gui import pylinuxauto
    - +from youqu3.gui import pylinuxauto
    + \ No newline at end of file diff --git "a/\350\247\204\345\210\222/YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.html" "b/\350\247\204\345\210\222/YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.html" index 294b9a0..26bc072 100644 --- "a/\350\247\204\345\210\222/YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.html" +++ "b/\350\247\204\345\210\222/YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.html" @@ -8,11 +8,11 @@ - + - + - + @@ -75,8 +75,8 @@ def test_mycase_001(self): ... - self.assert_**

    4.2.4. 配置对象

    用例工程配置对象继承 YouQu3 配置类,以此来获取框架已有的公共配置,同时定义一些用例工程相关的配置,如:assert_resstatic_resimage_res 的路径,以便方法或用例中能够获取到。

    4.2.5. 用例标签管理文件

    在 CSV 文件中定义用例对象的标签:

    • 维护标签时,不需要修改用例脚本。
    • 日常维护过程中,跳过用例可以直接通过修改 CSV 文件来控制用例是否跳过。

    4.2.6. 默认环境变量管理文件

    定义虚拟环境相关的一些环境变量,以此控制虚拟环境创建、运行的行为。

    4.2.7. 依赖管理文件

    定义用例工程所需要的依赖包。

    4.2.8. 调试用例驱动

    用于用例开发调试过程中,方便用例开发者以 debug 模式运行脚本。

    5. 演进规划

    可视化配置

    提供一个 Web 页面化的配置功能,配合远程执行功能,支持对各种测试策略的驱动执行。

    非开发者下运行

    支持在非开发着环境下运行用例:

    • 减少系统自动化环境准备的难度;
    • 更贴合大部分真实用户的使用场景;

    过程钩子

    支持对用例执行的各个阶段插入钩子,框架预设一些文件接口规范,用户只需要创建符合框架定义的文件命名规范脚本文件,即可自动被框架加载并执行。

    - + self.assert_**

    4.2.4. 配置对象

    用例工程配置对象继承 YouQu3 配置类,以此来获取框架已有的公共配置,同时定义一些用例工程相关的配置,如:assert_resstatic_resimage_res 的路径,以便方法或用例中能够获取到。

    4.2.5. 用例标签管理文件

    在 CSV 文件中定义用例对象的标签:

    • 维护标签时,不需要修改用例脚本。
    • 日常维护过程中,跳过用例可以直接通过修改 CSV 文件来控制用例是否跳过。

    4.2.6. 默认环境变量管理文件

    定义虚拟环境相关的一些环境变量,以此控制虚拟环境创建、运行的行为。

    4.2.7. 依赖管理文件

    定义用例工程所需要的依赖包。

    4.2.8. 调试用例驱动

    用于用例开发调试过程中,方便用例开发者以 debug 模式运行脚本。

    5. 演进规划

    可视化配置

    提供一个 Web 页面化的配置功能,配合远程执行功能,支持对各种测试策略的驱动执行。

    非开发者下运行

    支持在非开发着环境下运行用例:

    • 减少系统自动化环境准备的难度;
    • 更贴合大部分真实用户的使用场景;

    过程钩子

    支持对用例执行的各个阶段插入钩子,框架预设一些文件接口规范,用户只需要创建符合框架定义的文件命名规范脚本文件,即可自动被框架加载并执行。

    + \ No newline at end of file