diff --git a/404.html b/404.html index e260bbf..5a01eb2 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.CU_jiIbw.js b/assets/app.BDHzcKat.js similarity index 95% rename from assets/app.CU_jiIbw.js rename to assets/app.BDHzcKat.js index 64834bd..76500cc 100644 --- a/assets/app.CU_jiIbw.js +++ b/assets/app.BDHzcKat.js @@ -1 +1 @@ -import{R as i}from"./chunks/theme.DIB_5g2S.js";import{j as o,a6 as u,a7 as c,a8 as l,a9 as f,aa as d,ab as m,ac as h,ad as g,ae as A,af as v,d as w,u as y,l as C,z as P,ag as R,ah as b,ai as j,a4 as D}from"./chunks/framework.DB2UoSFq.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(c,e);const t=l(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.BowqbIWc.js";import{j as o,a6 as u,a7 as c,a8 as l,a9 as f,aa as d,ab as m,ac as h,ad as g,ae as A,af as v,d as w,u as y,l as C,z as P,ag as R,ah as b,ai as j,a4 as D}from"./chunks/framework.DB2UoSFq.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(c,e);const t=l(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.D_bJN1IY.js b/assets/chunks/@localSearchIndexroot.D_bJN1IY.js deleted file mode 100644 index 0ce1c6a..0000000 --- a/assets/chunks/@localSearchIndexroot.D_bJN1IY.js +++ /dev/null @@ -1 +0,0 @@ -const t='{"documentCount":137,"nextId":137,"documentIds":{"0":"/youqu3/实践/依赖管理.html#依赖管理","1":"/youqu3/实践/工程创建.html#工程创建","2":"/youqu3/实践/方法开发.html#方法开发","3":"/youqu3/实践/用例开发.html#用例开发","4":"/youqu3/实践/简介.html#从零开始构建自动化工程","5":"/youqu3/实践/配置模块.html#配置模块","6":"/youqu3/指南/与生俱来/JSON报告.html#json-报告","7":"/youqu3/指南/与生俱来/JSON报告.html#报告内容","8":"/youqu3/指南/与生俱来/JSON报告.html#整体结构","9":"/youqu3/指南/与生俱来/JSON报告.html#environment","10":"/youqu3/指南/与生俱来/JSON报告.html#summary","11":"/youqu3/指南/与生俱来/JSON报告.html#collectors","12":"/youqu3/指南/与生俱来/JSON报告.html#tests","13":"/youqu3/指南/与生俱来/JSON报告.html#warnings","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#动态等待","27":"/youqu3/指南/与生俱来/动态等待.html#架构动态等待","28":"/youqu3/指南/与生俱来/动态等待.html#元素识别动态等待","29":"/youqu3/指南/与生俱来/命令行交互.html#命令行交互","30":"/youqu3/指南/与生俱来/命令行交互.html#本机命令行交互","31":"/youqu3/指南/与生俱来/命令行交互.html#普通权限执行","32":"/youqu3/指南/与生俱来/命令行交互.html#sudo权限执行","33":"/youqu3/指南/与生俱来/命令行交互.html#expect交互","34":"/youqu3/指南/与生俱来/命令行交互.html#远程命令行交互","35":"/youqu3/指南/与生俱来/命令行交互.html#普通权限执行-1","36":"/youqu3/指南/与生俱来/命令行交互.html#sudo权限执行-1","37":"/youqu3/指南/与生俱来/命令行交互.html#expect交互-1","38":"/youqu3/指南/与生俱来/断言语句.html#断言语句","39":"/youqu3/指南/与生俱来/断言语句.html#用例中使用方法","40":"/youqu3/指南/与生俱来/断言语句.html#方法明细","41":"/youqu3/指南/与生俱来/标签化管理.html#标签化管理","42":"/youqu3/指南/与生俱来/标签化管理.html#使用说明","43":"/youqu3/指南/与生俱来/标签化管理.html#csv文件与脚本对应关系","44":"/youqu3/指南/与生俱来/标签化管理.html#跳过用例","45":"/youqu3/指南/与生俱来/标签化管理.html#_1-固定跳过","46":"/youqu3/指南/与生俱来/标签化管理.html#_2-条件判断跳过","47":"/youqu3/指南/与生俱来/标签化管理.html#_3-自定义跳过","48":"/youqu3/指南/与生俱来/标签化管理.html#确认修复","49":"/youqu3/指南/与生俱来/标签化管理.html#废弃用例","50":"/youqu3/指南/与生俱来/标签化管理.html#文件格式","51":"/youqu3/指南/与生俱来/脚手架工具.html#脚手架工具","52":"/youqu3/指南/与生俱来/远程交互控制.html#远程交互式控制","53":"/youqu3/指南/与生俱来/远程交互控制.html#slaves对象提供远程机器信息","54":"/youqu3/指南/与生俱来/远程交互控制.html#ui操作远程对象","55":"/youqu3/指南/与生俱来/远程交互控制.html#rpcgui","56":"/youqu3/指南/可选功能/GUI自动化.html#gui-自动化","57":"/youqu3/指南/可选功能/GUI自动化.html#安装","58":"/youqu3/指南/可选功能/GUI自动化.html#使用说明","59":"/youqu3/指南/可选功能/GUI自动化.html#导入","60":"/youqu3/指南/可选功能/GUI自动化.html#键鼠控制","61":"/youqu3/指南/可选功能/GUI自动化.html#属性定位","62":"/youqu3/指南/可选功能/GUI自动化.html#图像识别","63":"/youqu3/指南/可选功能/GUI自动化.html#ocr识别","64":"/youqu3/指南/可选功能/GUI自动化.html#相对位移定位","65":"/youqu3/指南/环境管理/原生环境.html#原生环境","66":"/youqu3/指南/环境管理/虚拟环境.html#虚拟环境","67":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-cargo","68":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-shell","69":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-rm","70":"/youqu3/指南/简介/YouQu3是什么.html#youqu3-能做什么","71":"/youqu3/指南/简介/快速开始.html#快速开始","72":"/youqu3/指南/简介/快速开始.html#安装","73":"/youqu3/指南/简介/快速开始.html#创建用例工程","74":"/youqu3/指南/驱动执行/本地执行.html#本地执行","75":"/youqu3/指南/驱动执行/本地执行.html#子命令","76":"/youqu3/指南/驱动执行/本地执行.html#用例驱动方式","77":"/youqu3/指南/驱动执行/本地执行.html#执行所有用例","78":"/youqu3/指南/驱动执行/本地执行.html#指定执行某一个用例","79":"/youqu3/指南/驱动执行/本地执行.html#指定某个目录执行","80":"/youqu3/指南/驱动执行/本地执行.html#根据关键词执行","81":"/youqu3/指南/驱动执行/本地执行.html#根据标签执行","82":"/youqu3/指南/驱动执行/本地执行.html#批量用例id驱动执行","83":"/youqu3/指南/驱动执行/本地执行.html#指定用例文件路径执行","84":"/youqu3/指南/驱动执行/自定义执行.html#自定义执行","85":"/youqu3/指南/驱动执行/自定义执行.html#youqu-tags-txt","86":"/youqu3/指南/驱动执行/自定义执行.html#youqu-keywords-txt","87":"/youqu3/指南/驱动执行/自定义执行.html#案例","88":"/youqu3/指南/驱动执行/自定义执行.html#pms用例驱动","89":"/youqu3/指南/驱动执行/远程执行.html#远程执行","90":"/youqu3/指南/驱动执行/远程执行.html#子命令","91":"/youqu3/指南/驱动执行/远程执行.html#远程测试机分组策略","92":"/youqu3/指南/驱动执行/远程执行.html#分组规则","93":"/youqu3/指南/驱动执行/远程执行.html#执行策略","94":"/youqu3/插件/插件列表.html#youqu3-插件汇总信息","95":"/youqu3/规划/UOS自动化测试方法套件.html#uos-自动化测试方法套件-umtk","96":"/youqu3/规划/UOS自动化测试方法套件.html#_1-简介","97":"/youqu3/规划/UOS自动化测试方法套件.html#_2-工程设计","98":"/youqu3/规划/UOS自动化测试方法套件.html#_2-1-工程结构","99":"/youqu3/规划/UOS自动化测试方法套件.html#_2-2-方案说明","100":"/youqu3/规划/UOS自动化测试方法套件.html#_3-套件发布","101":"/youqu3/规划/UOS自动化测试方法套件.html#_4-套件维护","102":"/youqu3/规划/UOS自动化测试方法套件.html#_5-对套件的测试","103":"/youqu3/规划/UOS自动化测试方法套件.html#_6-umtk-和-youqu2-的公共方法库-public-有何区别","104":"/youqu3/规划/UOS自动化测试用例.html#uos-自动化测试用例","105":"/youqu3/规划/UOS自动化测试用例.html#_1-简介","106":"/youqu3/规划/UOS自动化测试用例.html#_2-工程设计","107":"/youqu3/规划/UOS自动化测试用例.html#_2-1-工程结构","108":"/youqu3/规划/UOS自动化测试用例.html#_2-2-方案说明","109":"/youqu3/规划/YouQu3架构设计规划.html#youqu3-架构设计规划","110":"/youqu3/规划/YouQu3架构设计规划.html#_1-背景","111":"/youqu3/规划/YouQu3架构设计规划.html#_2-目标","112":"/youqu3/规划/YouQu3架构设计规划.html#_3-架构设计","113":"/youqu3/规划/YouQu3架构设计规划.html#_3-1-总体方案","114":"/youqu3/规划/YouQu3架构设计规划.html#_3-2-架构设计","115":"/youqu3/规划/YouQu3架构设计规划.html#_3-3-整体数据流","116":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-详细设计","117":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-1-驱动执行管理","118":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-2-配置项管理","119":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-3-框架总线接口","120":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-4-按测试类型管理插件","121":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-5-环境依赖管理","122":"/youqu3/规划/YouQu3架构设计规划.html#_4-用例工程设计","123":"/youqu3/规划/YouQu3架构设计规划.html#_4-1-用例工程结构","124":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-各模块编写思路","125":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-1-方法层","126":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-2-用例层","127":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-3-断言","128":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-4-配置对象","129":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-5-用例标签管理文件","130":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-6-默认环境变量管理文件","131":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-7-依赖管理文件","132":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-8-调试用例驱动","133":"/youqu3/规划/YouQu3架构设计规划.html#_5-演进规划","134":"/youqu3/规划/YouQu3架构设计规划.html#可视化配置","135":"/youqu3/规划/YouQu3架构设计规划.html#非开发者下运行","136":"/youqu3/规划/YouQu3架构设计规划.html#过程钩子"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,1],"1":[1,1,1],"2":[1,1,1],"3":[1,1,1],"4":[1,1,22],"5":[1,1,1],"6":[2,1,8],"7":[1,2,1],"8":[1,3,23],"9":[1,3,31],"10":[1,3,15],"11":[1,3,4],"12":[1,3,21],"13":[1,3,23],"14":[1,1,1],"15":[1,1,41],"16":[1,1,24],"17":[1,1,27],"18":[1,1,102],"19":[1,1,3],"20":[1,1,1],"21":[1,2,11],"22":[1,2,24],"23":[1,1,1],"24":[1,2,12],"25":[1,2,24],"26":[1,1,1],"27":[1,1,21],"28":[1,1,1],"29":[1,1,1],"30":[1,1,1],"31":[1,2,8],"32":[1,2,11],"33":[1,2,18],"34":[1,1,1],"35":[1,2,13],"36":[1,2,15],"37":[1,2,17],"38":[1,1,4],"39":[1,1,35],"40":[1,1,251],"41":[1,1,1],"42":[1,1,13],"43":[1,1,50],"44":[1,1,14],"45":[2,2,18],"46":[2,2,62],"47":[2,2,41],"48":[1,1,33],"49":[1,1,21],"50":[1,1,8],"51":[1,1,15],"52":[1,1,13],"53":[1,1,21],"54":[1,1,1],"55":[1,2,57],"56":[2,1,7],"57":[1,2,5],"58":[1,2,1],"59":[1,3,6],"60":[1,3,6],"61":[1,3,13],"62":[1,3,12],"63":[1,3,9],"64":[1,3,20],"65":[1,1,11],"66":[1,1,22],"67":[2,1,6],"68":[2,1,12],"69":[2,1,4],"70":[3,1,18],"71":[1,1,1],"72":[1,1,18],"73":[1,1,9],"74":[1,1,1],"75":[1,1,7],"76":[1,1,1],"77":[1,2,6],"78":[1,2,21],"79":[1,2,25],"80":[1,2,30],"81":[1,2,24],"82":[1,2,15],"83":[1,2,21],"84":[1,1,8],"85":[3,1,14],"86":[3,1,14],"87":[1,1,1],"88":[1,2,31],"89":[1,1,1],"90":[1,1,18],"91":[1,1,1],"92":[1,2,17],"93":[1,2,32],"94":[2,1,92],"95":[4,1,1],"96":[2,4,18],"97":[2,4,1],"98":[3,5,20],"99":[2,5,21],"100":[2,4,33],"101":[2,4,8],"102":[2,4,9],"103":[7,4,50],"104":[2,1,1],"105":[2,2,12],"106":[2,2,1],"107":[3,4,29],"108":[2,4,24],"109":[2,1,1],"110":[2,2,56],"111":[2,2,46],"112":[2,2,1],"113":[3,4,37],"114":[3,4,1],"115":[2,4,15],"116":[3,4,2],"117":[4,6,16],"118":[4,6,19],"119":[3,6,12],"120":[3,6,4],"121":[4,6,5],"122":[2,2,5],"123":[3,4,49],"124":[3,4,2],"125":[4,6,53],"126":[3,6,32],"127":[4,6,30],"128":[3,6,13],"129":[4,6,9],"130":[4,6,4],"131":[4,6,2],"132":[4,6,5],"133":[2,2,1],"134":[1,7,6],"135":[1,7,4],"136":[1,7,5]},"averageFieldLength":[1.6569343065693434,2.394160583941606,17.613138686131386],"storedFields":{"0":{"title":"依赖管理","titles":[]},"1":{"title":"工程创建","titles":[]},"2":{"title":"方法开发","titles":[]},"3":{"title":"用例开发","titles":[]},"4":{"title":"从零开始构建自动化工程","titles":[]},"5":{"title":"配置模块","titles":[]},"6":{"title":"JSON 报告","titles":[]},"7":{"title":"报告内容","titles":["JSON 报告"]},"8":{"title":"整体结构","titles":["JSON 报告","报告内容"]},"9":{"title":"Environment","titles":["JSON 报告","报告内容"]},"10":{"title":"Summary","titles":["JSON 报告","报告内容"]},"11":{"title":"Collectors","titles":["JSON 报告","报告内容"]},"12":{"title":"Tests","titles":["JSON 报告","报告内容"]},"13":{"title":"Warnings","titles":["JSON 报告","报告内容"]},"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":"动态等待","titles":[]},"27":{"title":"架构动态等待","titles":["动态等待"]},"28":{"title":"元素识别动态等待","titles":["动态等待"]},"29":{"title":"命令行交互","titles":[]},"30":{"title":"本机命令行交互","titles":["命令行交互"]},"31":{"title":"普通权限执行","titles":["命令行交互","本机命令行交互"]},"32":{"title":"sudo权限执行","titles":["命令行交互","本机命令行交互"]},"33":{"title":"expect交互","titles":["命令行交互","本机命令行交互"]},"34":{"title":"远程命令行交互","titles":["命令行交互"]},"35":{"title":"普通权限执行","titles":["命令行交互","远程命令行交互"]},"36":{"title":"sudo权限执行","titles":["命令行交互","远程命令行交互"]},"37":{"title":"expect交互","titles":["命令行交互","远程命令行交互"]},"38":{"title":"断言语句","titles":[]},"39":{"title":"用例中使用方法","titles":["断言语句"]},"40":{"title":"方法明细","titles":["断言语句"]},"41":{"title":"标签化管理","titles":[]},"42":{"title":"使用说明","titles":["标签化管理"]},"43":{"title":"CSV文件与脚本对应关系","titles":["标签化管理"]},"44":{"title":"跳过用例","titles":["标签化管理"]},"45":{"title":"1. 固定跳过","titles":["标签化管理","跳过用例"]},"46":{"title":"2. 条件判断跳过","titles":["标签化管理","跳过用例"]},"47":{"title":"3.自定义跳过","titles":["标签化管理","跳过用例"]},"48":{"title":"确认修复","titles":["标签化管理"]},"49":{"title":"废弃用例","titles":["标签化管理"]},"50":{"title":"文件格式","titles":["标签化管理"]},"51":{"title":"脚手架工具","titles":[]},"52":{"title":"远程交互式控制","titles":[]},"53":{"title":"slaves对象提供远程机器信息","titles":["远程交互式控制"]},"54":{"title":"UI操作远程对象","titles":["远程交互式控制"]},"55":{"title":"RpcGui","titles":["远程交互式控制","UI操作远程对象"]},"56":{"title":"GUI 自动化","titles":[]},"57":{"title":"安装","titles":["GUI 自动化"]},"58":{"title":"使用说明","titles":["GUI 自动化"]},"59":{"title":"导入","titles":["GUI 自动化","使用说明"]},"60":{"title":"键鼠控制","titles":["GUI 自动化","使用说明"]},"61":{"title":"属性定位","titles":["GUI 自动化","使用说明"]},"62":{"title":"图像识别","titles":["GUI 自动化","使用说明"]},"63":{"title":"OCR识别","titles":["GUI 自动化","使用说明"]},"64":{"title":"相对位移定位","titles":["GUI 自动化","使用说明"]},"65":{"title":"原生环境","titles":[]},"66":{"title":"虚拟环境","titles":[]},"67":{"title":"youqu3-cargo","titles":["虚拟环境"]},"68":{"title":"youqu3-shell","titles":["虚拟环境"]},"69":{"title":"youqu3-rm","titles":["虚拟环境"]},"70":{"title":"YouQu3 能做什么?","titles":[null]},"71":{"title":"快速开始","titles":[]},"72":{"title":"安装","titles":["快速开始"]},"73":{"title":"创建用例工程","titles":["快速开始"]},"74":{"title":"本地执行","titles":[]},"75":{"title":"子命令","titles":["本地执行"]},"76":{"title":"用例驱动方式","titles":["本地执行"]},"77":{"title":"执行所有用例","titles":["本地执行","用例驱动方式"]},"78":{"title":"指定执行某一个用例","titles":["本地执行","用例驱动方式"]},"79":{"title":"指定某个目录执行","titles":["本地执行","用例驱动方式"]},"80":{"title":"根据关键词执行","titles":["本地执行","用例驱动方式"]},"81":{"title":"根据标签执行","titles":["本地执行","用例驱动方式"]},"82":{"title":"批量用例ID驱动执行","titles":["本地执行","用例驱动方式"]},"83":{"title":"指定用例文件路径执行","titles":["本地执行","用例驱动方式"]},"84":{"title":"自定义执行","titles":[]},"85":{"title":"youqu-tags.txt","titles":["自定义执行"]},"86":{"title":"youqu-keywords.txt","titles":["自定义执行"]},"87":{"title":"案例","titles":["自定义执行"]},"88":{"title":"PMS用例驱动","titles":["自定义执行","案例"]},"89":{"title":"远程执行","titles":[]},"90":{"title":"子命令","titles":["远程执行"]},"91":{"title":"远程测试机分组策略","titles":["远程执行"]},"92":{"title":"分组规则","titles":["远程执行","远程测试机分组策略"]},"93":{"title":"执行策略","titles":["远程执行","远程测试机分组策略"]},"94":{"title":"YouQu3 插件汇总信息","titles":[null]},"95":{"title":"UOS 自动化测试方法套件(UMTK)","titles":[]},"96":{"title":"1. 简介","titles":["UOS 自动化测试方法套件(UMTK)"]},"97":{"title":"2. 工程设计","titles":["UOS 自动化测试方法套件(UMTK)"]},"98":{"title":"2.1. 工程结构","titles":["UOS 自动化测试方法套件(UMTK)","2. 工程设计"]},"99":{"title":"2.2. 方案说明","titles":["UOS 自动化测试方法套件(UMTK)","2. 工程设计"]},"100":{"title":"3. 套件发布","titles":["UOS 自动化测试方法套件(UMTK)"]},"101":{"title":"4. 套件维护","titles":["UOS 自动化测试方法套件(UMTK)"]},"102":{"title":"5. 对套件的测试","titles":["UOS 自动化测试方法套件(UMTK)"]},"103":{"title":"6. UMTK 和 YouQu2 的公共方法库(public)有何区别","titles":["UOS 自动化测试方法套件(UMTK)"]},"104":{"title":"UOS 自动化测试用例","titles":[]},"105":{"title":"1. 简介","titles":["UOS 自动化测试用例"]},"106":{"title":"2. 工程设计","titles":["UOS 自动化测试用例"]},"107":{"title":"2.1. 工程结构","titles":["UOS 自动化测试用例","2. 工程设计"]},"108":{"title":"2.2. 方案说明","titles":["UOS 自动化测试用例","2. 工程设计"]},"109":{"title":"YouQu3 架构设计规划","titles":[]},"110":{"title":"1. 背景","titles":["YouQu3 架构设计规划"]},"111":{"title":"2. 目标","titles":["YouQu3 架构设计规划"]},"112":{"title":"3. 架构设计","titles":["YouQu3 架构设计规划"]},"113":{"title":"3.1. 总体方案","titles":["YouQu3 架构设计规划","3. 架构设计"]},"114":{"title":"3.2. 架构设计","titles":["YouQu3 架构设计规划","3. 架构设计"]},"115":{"title":"3.3. 整体数据流","titles":["YouQu3 架构设计规划","3. 架构设计"]},"116":{"title":"3.4. 详细设计","titles":["YouQu3 架构设计规划","3. 架构设计"]},"117":{"title":"3.4.1. 驱动执行管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"118":{"title":"3.4.2. 配置项管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"119":{"title":"3.4.3. 框架总线接口","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"120":{"title":"3.4.4. 按测试类型管理插件","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"121":{"title":"3.4.5. 环境依赖管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"122":{"title":"4. 用例工程设计","titles":["YouQu3 架构设计规划"]},"123":{"title":"4.1. 用例工程结构","titles":["YouQu3 架构设计规划","4. 用例工程设计"]},"124":{"title":"4.2. 各模块编写思路","titles":["YouQu3 架构设计规划","4. 用例工程设计"]},"125":{"title":"4.2.1. 方法层","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"126":{"title":"4.2.2. 用例层","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"127":{"title":"4.2.3. 断言","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"128":{"title":"4.2.4. 配置对象","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"129":{"title":"4.2.5. 用例标签管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"130":{"title":"4.2.6. 默认环境变量管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"131":{"title":"4.2.7. 依赖管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"132":{"title":"4.2.8. 调试用例驱动","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"133":{"title":"5. 演进规划","titles":["YouQu3 架构设计规划"]},"134":{"title":"可视化配置","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]},"135":{"title":"非开发者下运行","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]},"136":{"title":"过程钩子","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]}},"dirtCount":0,"index":[["即可自动被框架加载并执行",{"2":{"136":1}}],["过程钩子",{"0":{"136":1}}],["过程中如果根据需要出小版本",{"2":{"100":1}}],["减少系统自动化环境准备的难度",{"2":{"135":1}}],["非开发者下运行",{"0":{"135":1}}],["配合远程执行功能",{"2":{"134":1}}],["配置对象",{"0":{"128":1}}],["配置文件管理配置项",{"2":{"118":1}}],["配置类",{"2":{"118":1,"128":1}}],["配置项管理",{"0":{"118":1},"2":{"118":1}}],["配置模块",{"0":{"5":1},"2":{"4":1,"123":1}}],["页面化的配置功能",{"2":{"134":1}}],["演进规划",{"0":{"133":1},"1":{"134":1,"135":1,"136":1}}],["模式运行脚本",{"2":{"132":1}}],["模块",{"2":{"117":1}}],["模块化改造",{"2":{"111":1}}],["模块名称为应用包名",{"2":{"99":1,"108":1}}],["模块名称",{"2":{"80":1}}],["定义用例工程所需要的依赖包",{"2":{"131":1}}],["定义虚拟环境相关的一些环境变量",{"2":{"130":1}}],["运行的行为",{"2":{"130":1}}],["运行稳定性",{"2":{"111":1}}],["日常维护过程中",{"2":{"129":1}}],["日志模板语法",{"2":{"18":1}}],["日志配置",{"0":{"17":1}}],["维护标签时",{"2":{"129":1}}],["维护方法的稳定性有效性将成为一个问题",{"2":{"102":1}}],["然后",{"2":{"127":1}}],["然后将这些基础能力通过",{"2":{"52":1}}],["任务栏点击文件管理器",{"2":{"125":1}}],["\\t\\tself",{"2":{"127":1}}],["\\t",{"2":{"125":1}}],["\\tdef",{"2":{"125":1}}],["弹窗",{"2":{"125":1}}],["左边视图区域",{"2":{"125":1}}],["右边视图区域",{"2":{"125":1}}],["标题栏",{"2":{"125":1}}],["标签驱动",{"2":{"113":1}}],["标签驱动支持",{"2":{"81":1}}],["标签",{"2":{"81":1}}],["标签记录为",{"2":{"46":1}}],["标签可以无序",{"2":{"43":1}}],["标签化管理",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1}}],["进行编写",{"2":{"125":1}}],["进行分割",{"2":{"47":1}}],["放置在对应的类里面",{"2":{"125":1}}],["调试用例驱动",{"0":{"132":1}}],["调试用例驱动脚本",{"2":{"123":1}}],["调用所有的断言语句",{"2":{"39":1}}],["调用方法时",{"2":{"18":1}}],["按测试类型管理插件",{"0":{"120":1}}],["按照",{"2":{"125":1}}],["按照业务流程调用方法进行用例代码开发",{"2":{"4":1}}],["按照以下章节",{"2":{"4":1}}],["上层用例就能通过框架动态调用插件提供的功能",{"2":{"119":1}}],["插槽",{"2":{"119":1}}],["插件如果已经安装",{"2":{"119":1}}],["插件",{"2":{"115":1}}],["插件汇总信息",{"0":{"94":1}}],["原则上不通过修改配置文件的方式修改",{"2":{"118":1}}],["原生环境虚拟环境",{"2":{"75":1,"77":1,"78":2,"79":1,"80":1,"81":1,"82":1,"83":3,"88":1,"90":1,"93":1}}],["原生环境",{"0":{"65":1}}],["公共配置为框架提供的一些具有默认值的配置项",{"2":{"118":1}}],["公共配置的形式",{"2":{"118":1}}],["显示的传入参数值",{"2":{"118":1}}],["采用虚拟环境管理依赖项",{"2":{"121":1}}],["采用命令行参数",{"2":{"118":1}}],["采用全新的架构设计",{"2":{"103":1}}],["解析测试策略",{"2":{"117":1}}],["解除跳过时将装饰器代码删掉",{"2":{"44":1}}],["获取命令行参数并结合配置项",{"2":{"117":1}}],["获取被装饰的类下所有函数",{"2":{"16":1}}],["驱动",{"2":{"117":1}}],["驱动命令将命令行参数传递给框架底层",{"2":{"117":1}}],["驱动执行管理",{"0":{"117":1}}],["驱动执行",{"2":{"79":1}}],["详细介绍各功能模块的设计和编写思路",{"2":{"124":1}}],["详细描述各模块工作方式",{"2":{"116":1}}],["详细设计",{"0":{"116":1},"1":{"117":1,"118":1,"119":1,"120":1,"121":1}}],["抛异常程序终止",{"2":{"115":1}}],["否则提示用户进行安装",{"2":{"115":1}}],["否则会提示无法连接",{"2":{"90":1}}],["底层功能",{"2":{"115":1}}],["让用户能专注于用例逻辑的编写和维护",{"2":{"113":1}}],["让你可以专注于用例和方法的编写维护",{"2":{"51":1}}],["管理",{"2":{"113":1}}],["资源目录",{"2":{"113":1}}],["生成的用例工程遵循完整的",{"2":{"113":1}}],["路径驱动",{"2":{"113":1}}],["三方包的形式提供",{"2":{"113":1}}],["由用例层决定使用哪些功能对应安装哪些插件",{"2":{"113":1}}],["由于虚拟环境中也安装了",{"2":{"68":1}}],["由于需求变更",{"2":{"49":1}}],["总体方案",{"0":{"113":1}}],["互不影响",{"2":{"111":1}}],["安全性稳定性更好",{"2":{"111":1}}],["安装",{"0":{"57":1,"72":1},"2":{"100":1}}],["降低使用门槛",{"2":{"111":1}}],["价值",{"2":{"111":1}}],["简化系统环境部署",{"2":{"111":1}}],["简介",{"0":{"96":1,"105":1}}],["搭配远程执行功能",{"2":{"111":1}}],["功能插件可插拔",{"2":{"113":1}}],["功能扩展性更好",{"2":{"111":1}}],["功能可插拔",{"2":{"111":1}}],["功能强大的自动化测试框架",{"2":{"110":1}}],["极致轻量化",{"2":{"111":1}}],["诸多亮点功能的同时解决其遇到的问题",{"2":{"111":1}}],["扩展性和兼容性更好的自动化测试框架",{"2":{"110":1}}],["更贴合大部分真实用户的使用场景",{"2":{"135":1}}],["更新",{"2":{"111":1}}],["更加纯粹",{"2":{"110":1}}],["更重要的是我们不想引入三方依赖",{"2":{"50":1}}],["甚至有些问题在现有框架结构下根本无法解决",{"2":{"110":1}}],["业务流程有一些影响",{"2":{"110":1}}],["业务不同",{"2":{"103":1}}],["势必对现有公司自动化用例",{"2":{"110":1}}],["等等",{"2":{"110":1}}],["绑定了太多公司的业务",{"2":{"110":1}}],["导致框架代码容易被用户修改",{"2":{"110":1}}],["导入",{"0":{"59":1}}],["源代码暴露在用户面前",{"2":{"110":1}}],["每次使用需要初始化框架工程及单独做环境部署",{"2":{"110":1}}],["每个应用存在一个唯一的出口文件",{"2":{"99":1}}],["每个机器执行",{"2":{"93":1}}],["每个模块建立一个",{"2":{"43":1}}],["每个用例的详细结果",{"2":{"12":1}}],["仍然存在一些不尽人意的地方",{"2":{"110":1}}],["小版本更新了数十个",{"2":{"110":1}}],["两个大版本",{"2":{"110":1}}],["两对大括号中的内容",{"2":{"18":1}}],["月在欧拉社区开源",{"2":{"110":1}}],["月正式在",{"2":{"110":1}}],["社区开源",{"2":{"110":1}}],["年",{"2":{"110":2}}],["年多的持续开发优化",{"2":{"110":1}}],["年成都测试团队开始内部孵化的项目",{"2":{"110":1}}],["经过了",{"2":{"110":1}}],["旨在成为下一代",{"2":{"111":1}}],["旨在开发一个简单易用",{"2":{"110":1}}],["旨在提供",{"2":{"105":1}}],["旨在提供系统预装应用所有的元素的操作方法",{"2":{"96":1}}],["做复杂步骤的封装",{"2":{"108":1}}],["里面导入使用",{"2":{"108":1}}],["编写的",{"2":{"105":1}}],["大量人员都可以对其进行直接修改",{"2":{"103":1}}],["稳定性",{"2":{"103":2}}],["确保操作方法的一致性",{"2":{"103":1}}],["确认修复",{"0":{"48":1},"2":{"42":1,"43":1,"48":3,"49":1}}],["代码一致性",{"2":{"103":1}}],["代表不跳过",{"2":{"47":1}}],["代表跳过",{"2":{"47":1}}],["容易受到需求变更",{"2":{"103":1}}],["仅包含自动化用例用到的少部分公共方法",{"2":{"103":1}}],["仅驱动执行这一条用例",{"2":{"78":1}}],["涵盖了",{"2":{"103":1}}],["范围覆盖很少",{"2":{"103":1}}],["范围",{"2":{"103":1}}],["内外部开发者们的认可",{"2":{"110":1}}],["内容",{"2":{"103":1}}],["内置支持的条件跳过对象",{"2":{"46":1}}],["二者属于两个时代",{"2":{"103":1}}],["有些问题处理起来必然会影响到框架的兼容性",{"2":{"110":1}}],["有效性没有保障",{"2":{"103":1}}],["有效性",{"2":{"103":1}}],["有很大差异",{"2":{"103":1}}],["有何区别",{"0":{"103":1}}],["亦各从其志也",{"2":{"103":1}}],["道",{"2":{"103":1}}],["卫灵公",{"2":{"103":1}}],["论语",{"2":{"103":1}}],["孔子",{"2":{"103":1}}],["适合有离线部署需求的用户",{"2":{"111":1}}],["适配厂商可以直接使用这些单元测试进行适配测试",{"2":{"102":1}}],["适用于气泡类的断言",{"2":{"40":1}}],["专门针对元素操作方法函数进行测试",{"2":{"102":1}}],["对象的属性值",{"2":{"118":1}}],["对纯",{"2":{"110":1}}],["对套件的测试",{"0":{"102":1}}],["对于用例规模比较大的应用",{"2":{"43":1}}],["鼓励内外部开发者贡献",{"2":{"101":1}}],["其中所有的用例步骤都应该调用方法层对应的方法",{"2":{"126":1}}],["其中有一张图片识别成功即返回结果",{"2":{"40":1}}],["其他人可以提需求",{"2":{"101":1}}],["发布",{"2":{"100":1}}],["发布一个套件版本",{"2":{"100":2}}],["阶段",{"2":{"100":1}}],["套件里面保存元素的操作方法",{"2":{"102":1}}],["套件由专人主责维护",{"2":{"101":1}}],["套件维护",{"0":{"101":1}}],["套件通过",{"2":{"100":1}}],["套件持续保持更新",{"2":{"100":1}}],["套件分大版本发布",{"2":{"100":1}}],["套件发布",{"0":{"100":1}}],["遵循",{"2":{"99":1}}],["供外部用例调用",{"2":{"99":1}}],["下划线连接单词",{"2":{"99":1,"108":1}}],["下完美的键鼠工具",{"2":{"94":1}}],["方便用例开发者以",{"2":{"132":1}}],["方便安装",{"2":{"111":1}}],["方案说明",{"0":{"99":1,"108":1}}],["方法唯一出口类",{"2":{"123":1}}],["方法基类",{"2":{"123":1}}],["方法层按需导入框架提供的底层能力",{"2":{"125":1}}],["方法层",{"0":{"125":1}}],["方法层目录",{"2":{"123":1}}],["方法层基础代码自动生成",{"2":{"113":1}}],["方法层所有的函数",{"2":{"18":1}}],["方法代码",{"2":{"113":1}}],["方法增删改的详细数据",{"2":{"94":1}}],["方法只能有一个入参",{"2":{"47":1}}],["方法必须有返回结果并且为布尔值",{"2":{"47":1}}],["方法名必须以",{"2":{"47":1}}],["方法编写规范",{"2":{"47":1}}],["方法明细",{"0":{"40":1}}],["方法库里面",{"2":{"18":1}}],["方法",{"2":{"16":1}}],["方法类如何组织",{"2":{"4":1}}],["方法开发",{"0":{"2":1},"2":{"4":1}}],["└──",{"2":{"98":4,"107":5,"123":3}}],["组装成自动化测试用例",{"2":{"96":1}}],["测试方法套件中所有的方法均为原子操作",{"2":{"99":1}}],["测试方法套件是一个独立项目",{"2":{"96":1}}],["测试单驱动插件",{"2":{"94":1}}],["测试单",{"2":{"88":1}}],["封装的",{"2":{"96":1}}],["系统中各应用在",{"2":{"108":1}}],["系统中各应用划分自己的模块",{"2":{"99":1}}],["系统所有预装应用的测试用例",{"2":{"105":1}}],["系统所有预装应用的原子操作方法",{"2":{"103":1}}],["系统级测试用例",{"2":{"105":1}}],["系统自动化测试操作方法套件",{"2":{"96":1}}],["系统显示协议跳过",{"2":{"46":1}}],["全面插件化模块化",{"2":{"111":1}}],["全面优化框架接口调用机制",{"2":{"111":1}}],["全称",{"2":{"96":1}}],["全自动日志插件",{"2":{"94":1}}],["全自动日志",{"0":{"14":1},"1":{"15":1,"16":1,"17":1,"18":1}}],["迁移工具",{"2":{"94":1}}],["操作系统环境支持不够友好",{"2":{"110":1}}],["操作系统预装应用的元素操作方法套件",{"2":{"96":1}}],["操作较为复杂",{"2":{"110":1}}],["操作或命令行操作",{"2":{"52":1}}],["操控插件",{"2":{"94":1}}],["键鼠操作插件",{"2":{"94":1}}],["键鼠控制",{"0":{"60":1}}],["✔️",{"2":{"94":15}}],["个机器瓜分",{"2":{"93":1}}],["个测试机",{"2":{"93":1}}],["个组",{"2":{"92":1}}],["都同时执行",{"2":{"93":1}}],["都不需要再写日志代码",{"2":{"18":1}}],["条",{"2":{"93":2}}],["条用例",{"2":{"93":2}}],["条件判断组合",{"2":{"47":1}}],["条件判断跳过",{"0":{"46":1}}],["假设总共",{"2":{"93":1}}],["同事们",{"2":{"110":1}}],["同一组内瓜分执行",{"2":{"93":1}}],["同时定义一些用例工程相关的配置",{"2":{"128":1}}],["同时框架可以在中间件中对插件功能进行增强或修改",{"2":{"119":1}}],["同时对各功能进行插件化",{"2":{"111":1}}],["同时选择多个环境",{"2":{"72":1}}],["同时标记了skip",{"2":{"48":1}}],["规则概述",{"2":{"93":1}}],["一键生成用例工程模板代码",{"2":{"113":1}}],["一些底层模块或接口命名不优雅",{"2":{"110":1}}],["一对大括号表示一个组",{"2":{"92":1}}],["一个元素一个方法",{"2":{"125":1}}],["一个页面一个类",{"2":{"125":1}}],["一个应用含有大量的操作函数",{"2":{"15":1}}],["一个函数里面至少包含一条日志信息",{"2":{"15":1}}],["分组规则",{"0":{"92":1}}],["分割",{"2":{"53":1}}],["服务的测试报告生成插件",{"2":{"94":1}}],["服务的",{"2":{"94":1}}],["服务的图像识别插件",{"2":{"94":1}}],["服务的方式提供出来",{"2":{"52":1}}],["服务",{"2":{"90":1}}],["开发",{"2":{"103":1}}],["开启",{"2":{"90":1}}],["开头",{"2":{"47":1}}],["开头的",{"2":{"17":1}}],["集合写入",{"2":{"88":1}}],["将基于youqu2的用例代码修改为youqu3",{"2":{"94":1}}],["将用例",{"2":{"88":1}}],["将跳过用例操作也整合进入用例标签",{"2":{"44":1}}],["案例",{"0":{"87":1},"1":{"88":1}}],["会自动加载并执行",{"2":{"85":1,"86":1}}],["会自动生成一个命令",{"2":{"65":1,"66":1}}],["支持对用例执行的各个阶段插入钩子",{"2":{"136":1}}],["支持对各种测试策略的驱动执行",{"2":{"134":1}}],["支持对依赖环境进行一键打包",{"2":{"121":1}}],["支持用例目录或文件路径驱动执行",{"2":{"117":1}}],["支持基于关键词驱动用例执行",{"2":{"117":1}}],["支持基于测试单驱动插件驱动用例执行",{"2":{"117":1}}],["支持基于用例标签化管理驱动用例执行",{"2":{"117":1}}],["支持本地和远程执行模式",{"2":{"117":1}}],["支持多种用例驱动模式",{"2":{"113":1}}],["支持非开发者下运行",{"2":{"111":1}}],["支持离线部署",{"2":{"111":1}}],["支持在非开发着环境下运行用例",{"2":{"135":1}}],["支持在",{"2":{"84":1}}],["支持类名包含",{"2":{"17":1}}],["支持类名以",{"2":{"17":2}}],["加引号",{"2":{"83":1}}],["加上装饰器",{"2":{"18":1}}],["批量用例id驱动执行",{"0":{"82":1}}],["特有的",{"2":{"81":1}}],["特殊标签",{"2":{"43":1}}],["表达式",{"2":{"80":1,"81":1}}],["表示用例的id",{"2":{"43":1}}],["表示识别任意一个目标字符",{"2":{"40":1}}],["表示识别所有目标字符",{"2":{"40":1}}],["关键词驱动等等",{"2":{"113":1}}],["关键词驱动支持",{"2":{"80":1}}],["关键词可以是用例对象中的任意字符",{"2":{"80":1}}],["整体数据流",{"0":{"115":1}}],["整体结构",{"0":{"8":1}}],["整个字符串中可以任意截取字符作为关键词",{"2":{"80":1}}],["且有完善的单元测试机制",{"2":{"103":1}}],["且存在较多涉及用例逻辑的复杂步骤方法",{"2":{"103":1}}],["且大小写不敏感",{"2":{"80":1}}],["且要方便能使用",{"2":{"50":1}}],["根据标签执行",{"0":{"81":1}}],["根据关键词执行",{"0":{"80":1}}],["根据不同的测试类型选择以上不同的安装命令",{"2":{"72":1}}],["根据不同的架构对等待时间进行倍数放大",{"2":{"27":1}}],["│\\t└──",{"2":{"79":1}}],["│\\t├──",{"2":{"79":1}}],["│",{"2":{"79":5,"98":5,"107":22,"123":12}}],["指定用例目录",{"2":{"83":1}}],["指定用例文件",{"2":{"83":1}}],["指定用例文件路径执行",{"0":{"83":1}}],["指定某个目录执行",{"0":{"79":1}}],["指定执行某一个用例",{"0":{"78":1}}],["本地执行子命令为",{"2":{"75":1}}],["本地执行",{"0":{"74":1},"1":{"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1}}],["本机命令行交互",{"0":{"30":1},"1":{"31":1,"32":1,"33":1}}],["基础环境默认支持",{"2":{"72":1}}],["基础环境guiwebuihttpremote",{"2":{"72":1}}],["基于此",{"2":{"15":1}}],["基于",{"2":{"15":1,"81":1,"94":4}}],["快速开始",{"0":{"71":1},"1":{"72":1,"73":1}}],["快速创建一个自动化用例工程模板",{"2":{"4":1}}],["无限可能",{"2":{"70":1}}],["🤙️",{"2":{"70":1}}],["接口自动化测试",{"2":{"70":2}}],["接口从而控制远程机器执行用例步骤",{"2":{"52":1}}],["🔥",{"2":{"94":1}}],["🚧",{"2":{"94":3}}],["🕷️",{"2":{"70":1}}],["🚀",{"2":{"70":1}}],["🚌",{"2":{"70":1}}],["💻",{"2":{"70":1}}],["🌏",{"2":{"70":1}}],["桌面应用",{"2":{"70":1}}],["☑",{"2":{"70":6}}],["能满足公司对自动化测试的业务需求",{"2":{"110":1}}],["能做什么",{"0":{"70":1}}],["能不能基于框架执行时",{"2":{"15":1}}],["$",{"2":{"68":1}}],["v25",{"2":{"100":1}}],["v20",{"2":{"100":2}}],["video",{"2":{"94":1}}],["virtualenv",{"2":{"68":1}}],["values",{"2":{"40":3}}],["删除虚拟环境",{"2":{"66":1}}],["激活虚拟环境",{"2":{"66":1}}],["命令安装使用",{"2":{"100":1}}],["命令可以将当前的虚拟环境删除",{"2":{"69":1}}],["命令",{"2":{"66":1}}],["命令行参数可以通过驱动命令提供入参选项",{"2":{"118":1}}],["命令行自动化",{"2":{"72":1}}],["命令行自动化测试",{"2":{"70":1}}],["命令行",{"2":{"53":1}}],["命令行传递参数",{"2":{"48":1}}],["命令行交互",{"0":{"29":1},"1":{"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1}}],["执行管理器接收命令行参数并读取公共配置项驱动用例执行",{"2":{"115":1}}],["执行模式支持本地驱动执行和远程驱动执行",{"2":{"113":1}}],["执行策略",{"0":{"93":1}}],["执行前确保远程机器已经开启了",{"2":{"90":1}}],["执行命令",{"2":{"88":1}}],["执行包含关键词的用例",{"2":{"80":1}}],["执行所有用例",{"0":{"77":1}}],["执行之后会自动创建一些有用的命令",{"2":{"66":1}}],["执行的时候会自动输出",{"2":{"18":1}}],["子命令",{"0":{"75":1,"90":1},"2":{"66":1}}],["还可以进行环境的管理",{"2":{"66":1}}],["虚拟环境默认在用例功能根目录下创建",{"2":{"121":1}}],["虚拟环境",{"0":{"66":1},"1":{"67":1,"68":1,"69":1}}],["你可以使用它进行用例的驱动执行和管理",{"2":{"65":1}}],["相对位移元素定位方案的配置文件",{"2":{"123":1}}],["相对位移定位插件",{"2":{"94":1}}],["相对位移定位",{"0":{"64":1}}],["相册的用例文件为",{"2":{"43":1}}],["图像识别方法所需要的资源",{"2":{"123":1}}],["图像识别",{"0":{"62":1}}],["图片路径",{"2":{"40":2}}],["属性定位插件",{"2":{"94":1}}],["属性定位",{"0":{"61":1}}],["了解更多",{"2":{"60":1,"61":1,"62":1,"63":1,"64":1}}],["种方式传入",{"2":{"53":1}}],["机器信息有",{"2":{"53":1}}],["它不能脱离",{"2":{"103":1}}],["它除了可以驱动用例执行",{"2":{"66":1}}],["它保存了远程测试机的信息列表",{"2":{"53":1}}],["它继承了",{"2":{"39":1}}],["交互的基础能力",{"2":{"52":1}}],["远程测试机分组策略",{"0":{"91":1},"1":{"92":1,"93":1}}],["远程机器执行的用例相同",{"2":{"90":1}}],["远程执行使用子命令",{"2":{"90":1}}],["远程执行就是用本地作为服务端控制远程机器执行",{"2":{"90":1}}],["远程执行",{"0":{"89":1},"1":{"90":1,"91":1,"92":1,"93":1}}],["远程交互式控制",{"0":{"52":1},"1":{"53":1,"54":1,"55":1}}],["远程命令行交互",{"0":{"34":1},"1":{"35":1,"36":1,"37":1}}],["创建一个目录",{"2":{"51":1,"73":1}}],["创建用例工程",{"0":{"73":1},"2":{"51":1}}],["设计思想",{"2":{"125":1}}],["设计模式",{"2":{"51":1,"99":1,"113":1}}],["设计理念进行方法封装",{"2":{"4":1}}],["脚手架工具",{"0":{"51":1}}],["脚本文件id",{"2":{"42":1,"43":1,"45":1,"46":1}}],["脚本一样即可",{"2":{"22":1,"25":1}}],["打开进行编辑查看",{"2":{"50":1}}],["此配置文件需要维护大量的标签数据",{"2":{"50":1}}],["此时会抛异常",{"2":{"119":1}}],["此时",{"2":{"43":1}}],["已废弃",{"2":{"49":1}}],["已修复",{"2":{"48":2,"49":1}}],["废弃原因",{"2":{"49":1}}],["废弃用例是特殊的标签",{"2":{"43":1}}],["废弃用例",{"0":{"49":1},"2":{"42":1,"49":2}}],["该列存在",{"2":{"49":1}}],["环境依赖管理",{"0":{"121":1}}],["环境依赖管理等相关功能的目录文件也都一键生成",{"2":{"113":1}}],["环境依赖可以一键打包交付",{"2":{"111":1}}],["环境以提供",{"2":{"52":1}}],["环境影响或评估不再适用于自动化测试时",{"2":{"49":1}}],["环境信息",{"2":{"9":1}}],["针对某些用例",{"2":{"49":1}}],["针对于某些用例修复后",{"2":{"48":1}}],["yes",{"2":{"48":2}}],["youqu2",{"0":{"103":1},"2":{"94":1,"103":4,"110":3,"111":1}}],["youqu",{"0":{"85":1,"86":1},"2":{"53":1,"81":1,"84":2,"85":2,"86":2,"88":3,"94":10,"110":1}}],["youqu3",{"0":{"67":1,"68":1,"69":1,"70":1,"94":1,"109":1},"1":{"110":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},"2":{"4":2,"15":2,"18":2,"19":1,"27":1,"31":1,"32":1,"33":1,"35":1,"36":1,"37":1,"38":1,"39":3,"40":10,"51":1,"52":1,"55":1,"57":1,"59":1,"65":2,"66":5,"67":1,"68":5,"69":1,"72":6,"73":1,"75":2,"77":2,"78":4,"79":2,"80":2,"81":2,"82":2,"83":6,"84":1,"85":1,"86":1,"90":2,"93":2,"94":3,"96":1,"103":2,"105":1,"108":1,"110":1,"111":1,"113":1,"115":2,"117":1,"118":1,"122":1,"125":1,"127":2,"128":1}}],["you",{"2":{"22":1,"25":1}}],["中间件",{"2":{"119":1}}],["中用例增删改",{"2":{"94":1}}],["中国",{"2":{"63":1}}],["中同时填入后",{"2":{"48":1}}],["中的任意一个",{"2":{"40":1}}],["当系统中安装了",{"2":{"65":1,"66":1}}],["当",{"2":{"48":1}}],["固定填入字段为",{"2":{"48":1}}],["固定跳过",{"0":{"45":1}}],["作为父类被",{"2":{"127":1}}],["作为标记该用例是否已经修复",{"2":{"48":1}}],["作为变量输出出来了",{"2":{"18":1}}],["新增一列标签名为",{"2":{"48":1}}],["但若用例层调用了此插件提供的功能",{"2":{"119":1}}],["但",{"2":{"110":1}}],["但仍然想要跳过用例",{"2":{"48":1}}],["但不能立即删除跳过原因",{"2":{"48":1}}],["但标签化管理的核心目的是集中化管理用例的标签",{"2":{"43":1}}],["推荐统一使用",{"2":{"47":1}}],["连接符号不可使用下划线和逗号",{"2":{"47":1}}],["连接服务器重试次数",{"2":{"40":1}}],["若插件没有被安装",{"2":{"119":1}}],["若插件已经安装",{"2":{"115":1}}],["若需要多个",{"2":{"47":1}}],["若函数需要多个参数",{"2":{"47":1}}],["若是",{"2":{"46":1}}],["重要",{"2":{"47":1}}],["重试间隔时间",{"2":{"40":1}}],["截取的左侧字符串作为函数名",{"2":{"47":1}}],["截取屏幕图片的间隔时间",{"2":{"40":1}}],["截取屏幕图片的时间",{"2":{"40":1}}],["k",{"2":{"78":4,"79":2,"80":2}}],["klvvw5821",{"2":{"46":1}}],["klvv",{"2":{"46":1}}],["keywords",{"0":{"86":1},"2":{"12":1,"84":1,"86":2}}],["符号将两个方法分开",{"2":{"47":1}}],["符号",{"2":{"46":1,"47":1}}],["剔除中横线和",{"2":{"46":1}}],["型号",{"2":{"46":1}}],["查看机器的",{"2":{"46":1}}],["查找图片",{"2":{"18":2}}],["说明",{"2":{"46":1,"66":1}}],["则正常调用",{"2":{"115":1}}],["则用例不会执行",{"2":{"49":1}}],["则用例不执行",{"2":{"47":1}}],["则新增一列标签名为",{"2":{"49":1}}],["则代码不会执行该条用例",{"2":{"48":1}}],["则执行该用例",{"2":{"47":1}}],["则跳过用例不执行",{"2":{"46":1}}],["则在此列备注具体的跳过原因",{"2":{"45":1}}],["或者",{"2":{"46":1}}],["判断当前架构是否为",{"2":{"46":1}}],["拼接",{"2":{"46":1}}],["多个用例文件",{"2":{"83":1}}],["多个机器信息用",{"2":{"53":1}}],["多个架构之间使用",{"2":{"46":1}}],["多个参数以逗号隔开",{"2":{"17":3}}],["架构设计",{"0":{"112":1,"114":1},"1":{"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1}}],["架构设计规划",{"0":{"109":1},"1":{"110":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}}],["架构不跳过",{"2":{"46":1}}],["架构跳过",{"2":{"46":1}}],["架构名",{"2":{"46":1}}],["架构动态等待",{"0":{"27":1}}],["常见的场景为在不同架构上判断是否执行",{"2":{"46":1}}],["某些用例会因为不同的环境判断用例是否执行",{"2":{"46":1}}],["参数",{"2":{"46":2}}],["参数值可以传递任意命令行命令",{"2":{"22":1,"25":1}}],["最后所有的用例类均继承",{"2":{"127":1}}],["最大化按钮",{"2":{"64":1}}],["最大匹配次数",{"2":{"40":1}}],["最大匹配超时",{"2":{"40":1}}],["最终的用例状态会被标签为",{"2":{"45":1}}],["受到某新需求影响",{"2":{"45":1,"48":1,"49":1}}],["各模块编写思路",{"0":{"124":1},"1":{"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"134":1,"135":1,"136":1}}],["各功能以插件的方式接入",{"2":{"113":1}}],["各种代码风格不统一",{"2":{"103":1}}],["各种用例标签",{"2":{"45":1,"46":1,"48":1,"49":1}}],["各架构倍数",{"2":{"27":1}}],["示例",{"2":{"45":1,"46":1,"48":1}}],["而通过",{"2":{"44":1}}],["传统跳过用例的方式是在用例脚本里面给用例添加装饰器",{"2":{"44":1}}],["传统的日志输出方式",{"2":{"15":1}}],["跳过对象",{"2":{"46":1}}],["跳过的原因标签为",{"2":{"46":1}}],["跳过的原因统一标签开头为",{"2":{"45":1}}],["跳过用例可以直接通过修改",{"2":{"129":1}}],["跳过用例",{"0":{"44":1},"1":{"45":1,"46":1,"47":1}}],["跳过原因一栏中填写为",{"2":{"46":1}}],["跳过原因",{"2":{"42":1,"43":1,"44":1,"45":1,"46":1,"48":2,"49":1}}],["因此我们才萌生了对框架结构进行重新设计想法",{"2":{"110":1}}],["因此我们大胆的设想",{"2":{"15":1}}],["因此",{"2":{"102":1,"103":1}}],["因此你仍然可以在虚拟环境中使用命令",{"2":{"68":1}}],["因此若",{"2":{"43":1}}],["目标",{"0":{"111":1}}],["目标字符",{"2":{"40":1}}],["目录之间用空格分割",{"2":{"83":1}}],["目录组合",{"2":{"83":1}}],["目录下划分自己的用例模块",{"2":{"108":1}}],["目录下所有用例",{"2":{"79":1}}],["目录下",{"2":{"43":1}}],["所有的操作步骤都应该有一个对应的方法",{"2":{"125":1}}],["所有的方法按照",{"2":{"125":1}}],["所有的元素操作方法",{"2":{"99":1}}],["所有代码由专人维护",{"2":{"103":1}}],["所有方法以类的形式编写",{"2":{"99":1}}],["所有",{"2":{"43":1}}],["建议分模块",{"2":{"43":1}}],["比如",{"2":{"46":1,"47":1,"65":1,"80":1,"100":2,"110":1,"125":2}}],["比如文件管理器",{"2":{"43":1}}],["比如气泡在1秒内消失",{"2":{"40":1}}],["后面会详细讲到",{"2":{"43":1}}],["后置命令行入参钩子",{"0":{"25":1}}],["后置脚本钩子",{"0":{"24":1}}],["后置钩子",{"0":{"23":1},"1":{"24":1,"25":1}}],["列之后的所有列都是一个用例标签",{"2":{"43":1}}],["列为",{"2":{"43":1}}],["第",{"2":{"43":1}}],["也可以对这个页面做进一步划分",{"2":{"125":1}}],["也可以方便对虚拟环境的管理和维护",{"2":{"121":1}}],["也可以是传统的",{"2":{"81":1}}],["也可以是自定义的数字代表用例序号",{"2":{"43":1}}],["也得到了公司领导",{"2":{"110":1}}],["也会正常执行",{"2":{"48":1}}],["也就是说我们需要写大量的日志代码",{"2":{"15":1}}],["举例",{"2":{"43":1}}],["取中间的名称作为",{"2":{"43":1}}],["去掉用例序号后的字符串",{"2":{"43":1}}],["quot",{"2":{"43":2,"72":2,"80":2,"82":2}}],["以便方法或用例中能够获取到",{"2":{"128":1}}],["以此控制虚拟环境创建",{"2":{"130":1}}],["以此来获取框架已有的公共配置",{"2":{"128":1}}],["以此类推",{"2":{"100":1}}],["以插件的形式提供功能",{"2":{"111":1}}],["以下简称测试用例",{"2":{"105":1}}],["以下简称测试方法套件",{"2":{"96":1}}],["以保持套件的各方面一致性",{"2":{"101":1}}],["以上写法表示有",{"2":{"92":1}}],["以",{"2":{"43":1,"111":1}}],["+",{"2":{"40":2,"46":1,"118":1}}],["`japan`",{"2":{"40":1}}],["`korean`",{"2":{"40":1}}],["`german`",{"2":{"40":1}}],["`fr`",{"2":{"40":1}}],["`en`",{"2":{"40":1}}],["`ch`",{"2":{"40":1}}],["返回",{"2":{"47":2}}],["返回识别到的所有数据",{"2":{"40":1}}],["返回图片中识别到的所有字符串",{"2":{"40":1}}],["只返回第一个",{"2":{"40":1}}],["只需要在出口文件加上类装饰器",{"2":{"18":1}}],["要识别的图片路径",{"2":{"40":1}}],["要识别的模板图片",{"2":{"40":1}}],["并提示用户安装对应插件",{"2":{"119":1}}],["并根据需要将测试结果",{"2":{"115":1}}],["并动态加载",{"2":{"115":1}}],["并在系统关键节点发布对应的版本",{"2":{"100":1}}],["并将截取的右侧作为参数传递给该函数",{"2":{"47":1}}],["并返回其在图片中的坐标",{"2":{"40":1}}],["并且所有调用的方法会以",{"2":{"18":1}}],["识别插件",{"2":{"94":1}}],["识别一个字符串或多个字符串",{"2":{"40":1}}],["识别率",{"2":{"40":1}}],["结果",{"2":{"40":2}}],["结尾的",{"2":{"17":1}}],["预期值",{"2":{"40":4}}],["不需要修改用例脚本",{"2":{"129":1}}],["不需要用户去了解和思考哪些插件适合哪种测试类型",{"2":{"120":1}}],["不再提供",{"2":{"118":1}}],["不安装插件的情况下框架也能正常运行",{"2":{"111":1}}],["不适合对外开源发布",{"2":{"103":1}}],["不涉及用例逻辑",{"2":{"103":1}}],["不受需求变更影响",{"2":{"103":1}}],["不兼容",{"2":{"103":1}}],["不相为谋",{"2":{"103":1}}],["不同",{"2":{"103":1}}],["不同组之间相同执行",{"2":{"93":1}}],["不做复杂步骤的封装",{"2":{"99":1}}],["不存在复杂步骤的堆叠封装",{"2":{"103":1}}],["不存在",{"2":{"40":2}}],["不显示",{"2":{"11":1}}],["存在跳过标签则用例也不会被执行",{"2":{"45":1}}],["存在",{"2":{"40":2}}],["应用名字",{"2":{"40":2}}],["元素不应该存在",{"2":{"40":1}}],["元素不存在",{"2":{"40":1}}],["元素识别动态等待",{"0":{"28":1}}],["匹配度",{"2":{"40":1}}],["匹配元素的格式",{"2":{"40":2}}],["匹配相似度",{"2":{"40":2}}],["是在",{"2":{"103":1}}],["是不同的测试方法套件版本",{"2":{"100":1}}],["是基于",{"2":{"96":1,"103":1,"105":1}}],["是专注于",{"2":{"56":1}}],["是",{"2":{"53":1,"110":1}}],["是否分模块维护取决于应用的用例复杂度",{"2":{"43":1}}],["是否递归查找",{"2":{"40":1}}],["是类装饰器",{"2":{"18":1}}],["断言",{"0":{"127":1}}],["断言方法类",{"2":{"123":1}}],["断言资源",{"2":{"123":1}}],["断言文案不存在",{"2":{"40":1}}],["断言文案存在",{"2":{"40":1}}],["断言文件不存在",{"2":{"40":1}}],["断言文件存在",{"2":{"40":1}}],["断言结果为假",{"2":{"40":1}}],["断言结果为真",{"2":{"40":1}}],["断言不相等",{"2":{"40":1}}],["断言相等",{"2":{"40":1}}],["断言应用进程不存在",{"2":{"40":1}}],["断言应用进程状态",{"2":{"40":4}}],["断言应用进程存在",{"2":{"40":1}}],["断言元素不存在",{"2":{"40":1}}],["断言元素存在",{"2":{"40":1}}],["断言语句",{"0":{"38":1},"1":{"39":1,"40":1}}],["~",{"2":{"40":2,"62":1,"64":1}}],["文件来控制用例是否跳过",{"2":{"129":1}}],["文件来管理跳过用例则会方便很多",{"2":{"44":1}}],["文件里面写关键词的表达式",{"2":{"86":1}}],["文件里面写标签的表达式",{"2":{"85":1}}],["文件里面跳过原因列是否存在跳过标签",{"2":{"45":1}}],["文件管理的标签",{"2":{"81":1}}],["文件管理器",{"2":{"55":1,"61":1,"125":2}}],["文件几乎是唯一能满足所有的要求的文件格式",{"2":{"50":1}}],["文件格式",{"0":{"50":1}}],["文件中定义用例对象的标签",{"2":{"129":1}}],["文件中自定义用例集驱动执行",{"2":{"84":1}}],["文件中所有的用例",{"2":{"78":1}}],["文件中查找是否有同名函数",{"2":{"47":1}}],["文件中",{"2":{"46":1}}],["文件中新增一列为",{"2":{"44":1}}],["文件中写入标签",{"2":{"42":1}}],["文件太多了也是一个很糟糕的事情",{"2":{"43":1}}],["文件建议放在一个",{"2":{"43":1}}],["文件",{"2":{"43":1,"85":1,"86":1,"88":2}}],["文件的文件名",{"2":{"43":1}}],["文件去掉首字符串",{"2":{"43":1}}],["文件存在",{"2":{"40":1}}],["文件名称",{"2":{"80":1}}],["文件名就应为",{"2":{"43":1}}],["文件名",{"2":{"40":1}}],["文件全路径",{"2":{"40":1}}],["文件全路径或目录",{"2":{"40":1}}],["文件不存在",{"2":{"40":1}}],["文管方法库出口",{"2":{"18":1}}],["期望结果",{"2":{"40":2}}],["期望元素不存在",{"2":{"40":1}}],["期望元素存在",{"2":{"40":1}}],["期望不存在文件路径",{"2":{"40":1}}],["期望存在文件路径",{"2":{"40":1}}],["期望界面不存在模板图片",{"2":{"40":1}}],["期望界面存在模板图片",{"2":{"40":1}}],["屏幕上匹配不存在图片",{"2":{"40":1}}],["屏幕上匹配图片",{"2":{"40":2}}],["默认环境变量管理文件",{"0":{"130":1},"2":{"123":1}}],["默认值为",{"2":{"40":1}}],["默认为",{"2":{"40":1}}],["默认不间隔",{"2":{"40":1}}],["默认关闭",{"2":{"11":1}}],["单位秒",{"2":{"40":3}}],[">不为假",{"2":{"40":1}}],[">不为真",{"2":{"40":1}}],[">不相等",{"2":{"40":2}}],[">是否相等",{"2":{"40":2}}],[">与实际值",{"2":{"40":4}}],[">",{"2":{"40":7}}],[">=",{"2":{"40":3}}],["例",{"2":{"40":3}}],["例如",{"2":{"15":1,"40":1,"46":1}}],["on",{"2":{"125":1,"126":1}}],["only",{"2":{"40":1}}],["or",{"2":{"40":1,"80":1,"81":3,"82":9,"85":2,"86":2}}],["ocr识别",{"0":{"63":1}}],["ocr",{"2":{"40":4,"63":1,"94":1}}],["os",{"2":{"40":5}}],["outcome",{"2":{"12":1}}],["8",{"0":{"132":1},"2":{"40":1,"55":1,"94":1,"110":1}}],["继承了",{"2":{"127":1}}],["继承",{"2":{"39":1,"127":1}}],["工程结构",{"0":{"98":1,"107":1}}],["工程设计",{"0":{"97":1,"106":1},"1":{"98":1,"99":1,"107":1,"108":1}}],["工程遵循完整的",{"2":{"51":1}}],["工程自有断言模块",{"2":{"39":1}}],["工程创建",{"0":{"1":1},"2":{"4":1}}],["几乎满足了所有的断言场景",{"2":{"38":1}}],["自定义执行",{"0":{"84":1},"1":{"85":1,"86":1,"87":1,"88":1}}],["自定义条件判断跳过的函数写在此文件中",{"2":{"47":1}}],["自定义跳过",{"0":{"47":1}}],["自定义断言类",{"2":{"40":1}}],["自带多种断言语句",{"2":{"38":1}}],["自动安装框架及改测试类型需要的插件依赖",{"2":{"120":1}}],["自动统计分析每次",{"2":{"94":1}}],["自动化插件",{"2":{"94":1}}],["自动化测试框架",{"2":{"111":1}}],["自动化测试框架操作方法封装写法",{"2":{"15":1}}],["自动化测试用例",{"0":{"104":1},"1":{"105":1,"106":1,"107":1,"108":1},"2":{"105":1}}],["自动化测试方法套件",{"0":{"95":1},"1":{"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1},"2":{"96":1}}],["自动化测试模块",{"2":{"94":1}}],["自动化测试",{"2":{"70":2}}],["自动化测试的框架",{"2":{"56":1}}],["自动化",{"0":{"56":1},"1":{"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1}}],["自动输出的日志",{"2":{"18":1}}],["自动将函数说明打印为日志",{"2":{"17":3}}],["自动的将函数说明作为日志打印出来",{"2":{"15":1}}],["umtk",{"0":{"95":1,"103":1},"1":{"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1},"2":{"96":1,"98":1,"99":1,"100":2,"103":4,"105":1,"108":2}}],["ut001234",{"2":{"88":4}}],["utf",{"2":{"40":1}}],["ui操作远程对象",{"0":{"54":1},"1":{"55":1}}],["ui",{"2":{"52":2,"64":2,"70":2,"94":1,"107":1,"123":1}}],["union",{"2":{"40":3}}],["uniontech",{"2":{"40":1}}],["usable",{"2":{"94":1}}],["usr",{"2":{"40":1}}],["user4",{"2":{"92":2,"93":2}}],["user3",{"2":{"92":2,"93":2}}],["user2",{"2":{"92":2,"93":2}}],["user1",{"2":{"92":2,"93":2}}],["user=",{"2":{"55":1}}],["user=user",{"2":{"55":1}}],["user",{"2":{"35":1,"36":1,"37":1,"55":1,"88":4}}],["username",{"2":{"33":1}}],["uos",{"0":{"95":1,"104":1},"1":{"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"105":1,"106":1,"107":1,"108":1},"2":{"18":1,"55":1,"96":4,"103":1,"105":3}}],["普通权限执行",{"0":{"31":1,"35":1}}],["增加了等待的日志",{"2":{"27":1}}],["优化",{"2":{"27":1}}],["可实现群控测试机执行",{"2":{"111":1}}],["可视化配置",{"0":{"134":1},"2":{"111":1}}],["可视化驱动",{"2":{"94":1}}],["可定制化依赖",{"2":{"111":1}}],["可自定义多个参数之间的连接符",{"2":{"47":1}}],["可以通过系统环境变量或修改",{"2":{"118":1}}],["可以根据测试项目类型安装对应的依赖",{"2":{"111":1}}],["可以在通过命令行快速驱动测试用例执行",{"2":{"113":1}}],["可以在无网络环境下直接运行",{"2":{"111":1}}],["可以在方法层",{"2":{"108":1}}],["可以对外开源发布",{"2":{"103":1}}],["可以调用",{"2":{"99":1}}],["可以自动安装对应的依赖集",{"2":{"72":1}}],["可以自动加载虚拟环境并驱动用例工程",{"2":{"67":1}}],["可以激活虚拟环境",{"2":{"68":1}}],["可以随意新增",{"2":{"43":1}}],["可以完全代替之前这样的写法",{"2":{"27":1}}],["可能包含多条日志信息",{"2":{"15":1}}],["group2",{"2":{"92":1,"93":1}}],["group1",{"2":{"92":1,"93":2}}],["group",{"2":{"92":1}}],["get",{"2":{"40":3}}],["getmembers",{"2":{"16":1}}],["gui",{"0":{"56":1},"1":{"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1},"2":{"40":7,"55":3,"56":1,"57":1,"59":1,"72":2,"94":1,"108":1}}],["gpl",{"2":{"40":1}}],["git",{"2":{"22":1,"25":1,"94":1,"113":1}}],["html",{"2":{"94":3}}],["http",{"2":{"70":1,"72":1}}],["htop",{"2":{"22":1,"25":1,"32":1,"36":1,"37":1}}],["h",{"2":{"65":1}}],["has",{"2":{"13":1}}],["就像写",{"2":{"22":1,"25":1}}],["就可以实现自动输出日志了",{"2":{"18":1}}],["入参",{"2":{"22":1,"25":1}}],["├──",{"2":{"21":3,"24":3,"79":4,"98":9,"107":19,"123":17}}],["框架预设一些文件接口规范",{"2":{"136":1}}],["框架的安装命令可以根据用例工程所属的测试类型",{"2":{"120":1}}],["框架的断言库",{"2":{"39":1}}],["框架可以正常运行",{"2":{"119":1}}],["框架底层对各功能插件提供",{"2":{"119":1}}],["框架总线接口",{"0":{"119":1}}],["框架提供驱动命令",{"2":{"117":1}}],["框架提供驱动执行的命令",{"2":{"113":1}}],["框架驱动命令传递命令行参数给执行管理器",{"2":{"115":1}}],["框架也提供初始化用例工程的功能",{"2":{"113":1}}],["框架源代码不直接呈现在用户面前",{"2":{"113":1}}],["框架代码及插件库以",{"2":{"113":1}}],["框架层提供总线服务",{"2":{"113":1}}],["框架和插件库独立维护更新",{"2":{"111":1}}],["框架而独立使用",{"2":{"103":1}}],["框架自动加载并执行对应标签的用例",{"2":{"88":1}}],["框架会在用例执行之前执行",{"2":{"22":1,"25":1}}],["框架会在用例执行之前自动加载并执行",{"2":{"21":1,"24":1}}],["框架支持通过",{"2":{"22":1,"25":1}}],["框架默认生成",{"2":{"6":1}}],["前置命令行入参钩子",{"0":{"22":1}}],["前置脚本钩子",{"0":{"21":1}}],["前置钩子",{"0":{"20":1},"1":{"21":1,"22":1}}],["前后钩子",{"0":{"19":1},"1":{"20":1,"21":1,"22":1,"23":1,"24":1,"25":1}}],["提高",{"2":{"111":1}}],["提高用例开发效率",{"2":{"111":1}}],["提高可维护性",{"2":{"4":1}}],["提供一个",{"2":{"134":1}}],["提供可调用的配置对象config",{"2":{"123":1}}],["提供丰富的键鼠控制及多种元素定位方案",{"2":{"56":1}}],["提供的一个全局对象",{"2":{"53":1}}],["提供灵活的前后钩子机制",{"2":{"19":1}}],["这些元素操作方法可以用于自动化用例调用",{"2":{"96":1}}],["这个命令可以在系统原生环境中使用",{"2":{"66":1}}],["这样在用例中能够使用统一的断言语句",{"2":{"127":1}}],["这样在日志输出的时候就能把调用函数时参数的值输出出来",{"2":{"18":1}}],["这样这条用例即使同时标记了",{"2":{"48":1}}],["这种方式需要修改用例代码",{"2":{"44":1}}],["这就是我们参考django",{"2":{"18":1}}],["用户只需要创建符合框架定义的文件命名规范脚本文件",{"2":{"136":1}}],["用户只需要关注用例",{"2":{"113":1}}],["用户可直接通过",{"2":{"100":1}}],["用于用例开发调试过程中",{"2":{"132":1}}],["用于统一存放用例步骤的操作方法",{"2":{"125":1}}],["用于统一管理命令行参数驱动用例执行",{"2":{"117":1}}],["用于虚拟环境安装",{"2":{"66":1}}],["用于属性定位相关操作",{"2":{"55":1}}],["用于保存用例标签",{"2":{"43":1}}],["用例标签管理文件",{"0":{"129":1},"2":{"123":1}}],["用例标签化管理插件",{"2":{"94":1}}],["用例示例",{"2":{"123":2}}],["用例工程配置对象继承",{"2":{"128":1}}],["用例工程配置模块建议继承",{"2":{"118":1}}],["用例工程的断言方法类",{"2":{"127":1}}],["用例工程名称",{"2":{"123":1}}],["用例工程结构",{"0":{"123":1}}],["用例工程支持一键创建",{"2":{"122":1}}],["用例工程设计",{"0":{"122":1},"1":{"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1}}],["用例层负责管理用例逻辑",{"2":{"126":1}}],["用例层目录",{"2":{"123":1}}],["用例层",{"0":{"126":1},"2":{"113":1}}],["用例层直接",{"2":{"113":1}}],["用例整体打包交付之后",{"2":{"111":1}}],["用例失败录屏插件",{"2":{"94":1}}],["用例文件",{"2":{"83":1}}],["用例驱动方式",{"0":{"76":1},"1":{"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1}}],["用例执行所需要的资源",{"2":{"123":1}}],["用例执行完成后生成多种测试报告",{"2":{"115":1}}],["用例执行过程中动态调用",{"2":{"115":1}}],["用例执行驱动的命令",{"2":{"66":1}}],["用例执行时判断",{"2":{"45":1}}],["用例需要废弃",{"2":{"49":1}}],["用例id",{"2":{"48":1,"49":1}}],["用例脚本的",{"2":{"43":1}}],["用例中所需要的方法从",{"2":{"108":1}}],["用例中通过",{"2":{"39":1}}],["用例中使用方法",{"0":{"39":1}}],["用例基类",{"2":{"39":2,"123":1}}],["用例开发环境下更新版本不方便",{"2":{"110":1}}],["用例开发",{"0":{"3":1},"2":{"4":1}}],["用两对大括号把函数的参数括起来",{"2":{"18":1}}],["job",{"2":{"21":2,"22":3,"24":2,"25":3,"88":4}}],["jinja2",{"2":{"18":1}}],["json",{"0":{"6":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1},"2":{"6":3,"8":1,"9":1,"10":1,"12":1,"13":1}}],["和上面逻辑相反",{"2":{"46":1}}],["和",{"0":{"103":1},"2":{"18":1,"48":2,"93":1,"103":2,"105":1,"110":1}}],["没错",{"2":{"18":1}}],["函数名等等都可以做为关键词",{"2":{"80":1}}],["函数名",{"2":{"46":1}}],["函数功能说明中",{"2":{"18":1}}],["函数说明以及函数操作日志",{"2":{"15":1}}],["细心的同学可能还发现了一个小细节",{"2":{"18":1}}],["展示在",{"2":{"18":1}}],["静态方法",{"2":{"18":1}}],["包的形式提供框架能力",{"2":{"111":1}}],["包含",{"2":{"93":1}}],["包含静态方法",{"2":{"16":1}}],["包括实例方法",{"2":{"18":1}}],["之后",{"2":{"18":1,"65":1,"66":1}}],["|",{"2":{"18":2}}],["md",{"2":{"98":1,"107":1}}],["movie",{"2":{"98":1}}],["mousekey",{"2":{"94":1}}],["mode",{"2":{"40":6}}],["music",{"2":{"80":5,"83":6,"98":3}}],["multiple=multiple",{"2":{"18":1,"40":2}}],["multiple=false",{"2":{"18":1}}],["multiple",{"2":{"18":1,"40":2}}],["my",{"2":{"39":1,"51":2,"68":1,"73":2,"79":1,"123":2,"125":1,"126":1}}],["mycasemethod",{"2":{"125":1,"126":2}}],["mycase",{"2":{"39":1,"79":2,"123":3,"126":2,"127":2}}],["maintainer",{"2":{"101":1}}],["main",{"2":{"55":1}}],["manage",{"2":{"48":1,"94":1,"125":1,"126":1}}],["manager",{"2":{"40":1,"55":2,"64":1,"98":2,"99":2,"100":1,"107":2,"108":1,"126":1}}],["mark",{"2":{"44":1,"81":1,"94":1}}],["max",{"2":{"40":7}}],["match",{"2":{"40":11}}],["machine",{"2":{"33":1}}],["map",{"2":{"18":1}}],["mips64",{"2":{"27":1}}],["method",{"2":{"17":1,"18":3,"21":1,"24":1,"39":4,"96":1,"98":4,"107":5,"108":1,"123":4,"125":3,"126":2,"127":4}}],["metadata",{"2":{"9":1,"12":1}}],["message",{"2":{"13":1}}],["注意",{"2":{"18":1,"72":1,"80":1,"82":1,"83":1}}],["num",{"2":{"94":1}}],["number=max",{"2":{"40":2}}],["number=match",{"2":{"40":2}}],["number",{"2":{"40":9}}],["network",{"2":{"40":9}}],["not",{"2":{"40":13,"46":2,"80":1,"81":1}}],["none",{"2":{"40":26}}],["nodeid",{"2":{"12":1,"13":1}}],["n",{"2":{"33":1}}],["name=",{"2":{"64":1}}],["name",{"2":{"17":3,"46":3,"55":1,"94":1}}],["==",{"2":{"40":5,"55":1}}],["=",{"2":{"17":4,"18":1,"27":5,"40":36,"55":2}}],["终端输出的日志级别",{"2":{"17":1}}],["动态等待",{"0":{"26":1},"1":{"27":1,"28":1}}],["动态添加日志装饰器",{"2":{"16":1}}],["动态给该类下所有的函数及父类函数添加日志装饰器",{"2":{"16":1}}],["给符合条件的函数",{"2":{"16":1}}],["实际结果",{"2":{"40":2}}],["实例",{"2":{"18":1}}],["实例方法",{"2":{"16":1}}],["实现插件依赖的定制化",{"2":{"113":1}}],["实现步骤",{"2":{"16":1}}],["实现原理",{"0":{"16":1}}],["类似于单元测试",{"2":{"102":1}}],["类名",{"2":{"80":1}}],["类",{"2":{"16":1}}],["类方法",{"2":{"16":1,"18":1}}],["类里面一个函数只包含一个操作或多次调用的一系列可合并的操作",{"2":{"15":1}}],["在浏览器中输入一些配置后即可驱动测试用例执行",{"2":{"111":1}}],["在继承",{"2":{"111":1}}],["在现有框架下",{"2":{"110":1}}],["在公司的多个自动化流程中运行得很好",{"2":{"110":1}}],["在公司内部已经被大量的自动化测试项目使用",{"2":{"110":1}}],["在操作方法多了之后",{"2":{"102":1}}],["在同一个大版本中",{"2":{"100":1}}],["在不同的代码仓库中",{"2":{"100":1}}],["在根目录下定义",{"2":{"85":1,"86":1}}],["在服务端通过调用",{"2":{"52":1}}],["在远程测试机上部署一个完整的",{"2":{"52":1}}],["在用例执行过程中控制远程机器执行复杂的",{"2":{"52":1}}],["在用例收集阶段会以第一个",{"2":{"47":1}}],["在用例工程根目录下存放",{"2":{"47":1}}],["在用例工程目录下存放一个",{"2":{"21":1,"24":1}}],["在用例工程目录下生成报告文件",{"2":{"6":1}}],["在子项目目录下新建",{"2":{"43":1}}],["在",{"2":{"42":1,"44":1,"46":1,"47":1,"129":1}}],["在一段时间内截图多张图片进行识别",{"2":{"40":1}}],["在报告中更能一目了然的看到用例执行步骤",{"2":{"18":1}}],["在屏幕中相似度大于",{"2":{"18":2}}],["在应用库",{"2":{"18":1}}],["在此装饰器中我们能动态的捕获所调用函数的功能说明",{"2":{"16":1}}],["核心原理",{"2":{"16":1}}],["的路径",{"2":{"128":1}}],["的思路",{"2":{"125":1}}],["的框架下进行开发的",{"2":{"103":1}}],["的公共方法库",{"0":{"103":1},"2":{"103":1}}],["的用例",{"2":{"48":1}}],["的脚本",{"2":{"21":1,"24":1}}],["的模板语法设计出的日志模板语法",{"2":{"18":1}}],["的坐标",{"2":{"18":2}}],["的",{"2":{"17":1,"94":1,"127":1}}],["的方式",{"2":{"16":1,"18":1}}],["的日志系统",{"2":{"15":1}}],["的想法",{"2":{"15":1}}],["天真",{"2":{"15":1}}],["那真是妙啊~",{"2":{"15":1}}],["从任务栏启动文件管理器",{"2":{"126":1}}],["从而驱动测试用例执行",{"2":{"117":1}}],["从而减少大量日志代码量和重复编写",{"2":{"15":1}}],["从开源至今发布了",{"2":{"110":1}}],["从pms测试单中爬取用例集",{"2":{"88":1}}],["从第",{"2":{"43":1}}],["从上面的例子也可以看出来",{"2":{"15":1}}],["从零开始构建一个完成的自动化用例工程",{"2":{"4":1}}],["从零开始构建自动化工程",{"0":{"4":1}}],["具有较高的重复度",{"2":{"15":1}}],["我们可以将界面分为四个区域",{"2":{"125":1}}],["我们想要设计开发一个更加简单易用",{"2":{"110":1}}],["我们需要建立对套件的自动化测试",{"2":{"102":1}}],["我们设计出了",{"2":{"15":1}}],["我们发现",{"2":{"15":1}}],["我们将指导如何基于",{"2":{"4":1}}],["通过配置的接口进行数据回填",{"2":{"115":1}}],["通过命令行参数控制",{"2":{"113":1}}],["通过获取该函数返回的布尔值",{"2":{"47":1}}],["通过ocr识别到不应存在的文案",{"2":{"40":2}}],["通过ocr未识别到",{"2":{"40":3}}],["通过观察前面的例子",{"2":{"18":1}}],["通过",{"2":{"16":2}}],["通过日志输出器将其输出即可",{"2":{"16":1}}],["通过给类加上一个装饰器",{"2":{"16":1}}],["通过经验观察",{"2":{"15":1}}],["通常是这样的",{"2":{"15":1}}],["如",{"2":{"85":1,"86":1,"113":1,"128":1}}],["如果一个页面元素操作比较多",{"2":{"125":1}}],["如果一个应用存在多个页面",{"2":{"125":1}}],["如果涉及到复杂步骤的封装",{"2":{"108":1}}],["如果你想执行这个",{"2":{"78":1}}],["如果应用受到新需求影响需要跳过",{"2":{"45":1}}],["如果不传默认截取全屏识别",{"2":{"40":1}}],["如果不传参",{"2":{"40":1}}],["如果用常规的图像识别则有可能无法识别到",{"2":{"40":1}}],["如果比较复杂操作步骤",{"2":{"15":1}}],["如何管理自动化用例工程的依赖项",{"2":{"4":1}}],["如何编写",{"2":{"4":1}}],["省略代码部分",{"2":{"15":1}}],["l1",{"2":{"81":3}}],["lang",{"2":{"40":1}}],["lang=lang",{"2":{"40":2}}],["lang=",{"2":{"40":2}}],["lambda",{"2":{"18":1,"40":2}}],["leftmethod",{"2":{"125":1}}],["len",{"2":{"40":4}}],["level",{"2":{"17":1}}],["list",{"2":{"40":1}}],["license",{"2":{"40":1,"98":1,"107":1}}],["lineno",{"2":{"12":1}}],["linuxdeepin",{"2":{"110":1}}],["linux",{"2":{"9":1,"56":1,"70":3,"72":1,"94":1,"111":1}}],["ltd",{"2":{"40":1}}],["l",{"2":{"33":1,"35":1}}],["ls",{"2":{"31":1,"33":1,"35":1}}],["loogarch64",{"2":{"46":2}}],["loongarch64",{"2":{"27":1}}],["lower",{"2":{"40":1}}],["log",{"2":{"16":1,"17":1,"18":5,"40":2}}],["logger",{"2":{"15":1,"18":1,"40":12}}],["点击某个元素",{"2":{"15":2,"18":1}}],["dragon",{"2":{"94":1}}],["driver",{"2":{"88":5,"94":1,"117":2}}],["d",{"2":{"94":1}}],["dbus",{"2":{"70":1}}],["dmidecode",{"2":{"46":1}}],["dict",{"2":{"40":4}}],["ddefilemanagermethod",{"2":{"99":2,"100":1,"108":1}}],["dde",{"2":{"40":1,"55":3,"61":1,"64":1,"98":2,"99":2,"100":1,"107":4,"108":1,"125":1,"126":2}}],["during",{"2":{"40":2}}],["duration",{"2":{"8":1}}],["double",{"2":{"60":1}}],["dogtail",{"2":{"55":1,"94":1,"125":3}}],["do",{"2":{"22":2,"25":2}}],["dock",{"2":{"55":1,"61":1,"107":4,"125":1,"126":1}}],["doc",{"2":{"16":1}}],["dfm",{"2":{"18":2,"107":2}}],["deepin",{"2":{"98":4}}],["desc",{"2":{"94":1}}],["desktop",{"2":{"40":2,"62":1,"64":1}}],["debug",{"2":{"17":1,"123":1,"132":1}}],["def",{"2":{"15":1,"18":2,"39":1,"40":15,"55":2,"78":2,"126":1,"127":1}}],["需要在每个函数里面主动编写日志输出代码",{"2":{"15":1}}],["背景",{"0":{"15":1,"110":1}}],["id",{"2":{"88":5}}],["id4",{"2":{"82":3}}],["id3",{"2":{"82":3,"85":1,"86":1}}],["id2",{"2":{"82":3,"85":1,"86":1}}],["id1",{"2":{"82":3}}],["identifier",{"2":{"40":1}}],["issue",{"2":{"101":1}}],["isinstance",{"2":{"40":4}}],["is",{"2":{"40":6}}],["ifixed",{"2":{"48":2}}],["if",{"2":{"40":23,"55":1}}],["ip4",{"2":{"92":2,"93":2}}],["ip3",{"2":{"92":2,"93":2}}],["ip2",{"2":{"92":2,"93":2}}],["ip1",{"2":{"92":2,"93":2}}],["ip=",{"2":{"55":1}}],["ip=ip",{"2":{"55":1}}],["ip",{"2":{"33":1,"35":1,"36":1,"37":1,"55":1}}],["imagecenter",{"2":{"94":1}}],["image",{"2":{"18":4,"40":6,"62":1,"123":1,"128":1}}],["import",{"2":{"17":1,"18":2,"27":2,"31":1,"32":1,"33":1,"35":1,"36":1,"37":1,"39":3,"40":12,"55":2,"59":1,"99":1,"100":1,"108":2,"113":1,"125":2,"126":2,"127":3}}],["in",{"2":{"40":2}}],["int",{"2":{"40":18}}],["ini",{"2":{"64":1,"107":2,"118":1,"123":1}}],["inix86",{"2":{"27":1}}],["init",{"2":{"13":1,"51":2,"55":1,"73":1,"79":1,"98":3,"107":4,"122":1,"123":2}}],["install",{"2":{"22":1,"25":1,"32":1,"36":1,"37":1,"57":1,"72":6,"100":1}}],["inspect",{"2":{"16":1}}],["info",{"2":{"15":1,"17":2,"18":1,"40":11}}],["items",{"2":{"40":2}}],["it",{"2":{"13":1}}],["auto",{"2":{"55":3}}],["autotest",{"2":{"51":2,"73":2,"96":1}}],["amp",{"2":{"46":3,"47":5}}],["album",{"2":{"43":2}}],["all",{"2":{"40":5}}],["allure",{"2":{"18":2}}],["and",{"2":{"40":3,"80":4,"81":1}}],["any",{"2":{"40":3}}],["arrch64",{"2":{"46":1}}],["args",{"2":{"40":7}}],["arch",{"2":{"9":2}}],["actual",{"2":{"40":10}}],["as",{"2":{"40":3}}],["assertionerror",{"2":{"40":18}}],["assertmethod",{"2":{"39":5,"127":5}}],["assertx",{"2":{"39":1}}],["assert",{"2":{"39":6,"40":18,"107":1,"123":2,"126":1,"127":9,"128":1}}],["abspath=config",{"2":{"55":1}}],["abspath=pic",{"2":{"40":2}}],["abspath=picture",{"2":{"40":2}}],["abspath=none",{"2":{"40":2}}],["abspath",{"2":{"40":9,"55":1}}],["aarch64",{"2":{"27":1,"46":4,"47":1}}],["apt",{"2":{"22":1,"25":1,"32":1,"36":1,"37":1}}],["appname=",{"2":{"64":1}}],["app",{"2":{"18":5,"39":1,"40":10,"79":1}}],["appmethod",{"2":{"15":1,"18":2}}],["attr",{"2":{"15":1,"18":1,"40":2,"55":3,"61":1}}],["a",{"2":{"13":1}}],["button",{"2":{"94":1}}],["bus",{"2":{"94":1}}],["btn",{"2":{"55":1,"61":1,"64":1,"125":1}}],["bool",{"2":{"40":4}}],["bin",{"2":{"40":1}}],["basemethod",{"2":{"125":2}}],["base",{"2":{"39":1,"79":1,"107":2,"123":2,"125":1,"126":1,"127":2}}],["basecase",{"2":{"39":3,"126":2,"127":5}}],["bash$",{"2":{"68":1,"75":2,"77":2,"78":4,"79":2,"80":2,"81":2,"82":2,"83":6,"90":3,"93":2}}],["bashpip",{"2":{"57":1,"72":5}}],["bashpython3",{"2":{"48":1}}],["bash",{"2":{"53":1}}],["bashcd",{"2":{"51":1,"73":1}}],["bashmkdir",{"2":{"51":1,"73":1}}],["bashmy",{"2":{"21":1,"24":1}}],["bashyouqu3",{"2":{"22":2,"25":2,"53":1,"65":2,"66":1,"67":1,"88":2}}],["bash>>",{"2":{"18":1}}],["bar",{"2":{"9":1,"12":1}}],["by",{"2":{"15":1,"18":1,"40":6,"55":3,"61":1,"62":1,"63":1,"64":1}}],["because",{"2":{"13":1}}],["警告信息",{"2":{"13":1}}],["收集器节点的列表",{"2":{"11":1}}],["smoke",{"2":{"79":4,"81":2}}],["slaves",{"2":{"53":3}}],["slaves对象提供远程机器信息",{"0":{"53":1}}],["sleep",{"2":{"27":3}}],["systemctl",{"2":{"90":1}}],["system",{"2":{"46":1}}],["s",{"2":{"46":1}}],["skipif",{"2":{"46":8,"47":6}}],["skiped",{"2":{"45":1}}],["skip",{"2":{"42":1,"44":1,"45":2,"48":3,"49":1}}],["skipped",{"2":{"10":1}}],["similarity=similarity",{"2":{"40":2}}],["similarity=0",{"2":{"40":2}}],["similarity",{"2":{"40":1}}],["screen",{"2":{"40":8}}],["software",{"2":{"40":1}}],["spdx",{"2":{"40":2}}],["ssh",{"2":{"33":1,"90":3}}],["sw64",{"2":{"46":4}}],["sw",{"2":{"27":1}}],["sudo权限执行",{"0":{"32":1,"36":1}}],["sudo",{"2":{"22":1,"25":1,"32":1,"36":1,"37":1,"46":1,"90":1}}],["summary",{"0":{"10":1},"2":{"8":2}}],["shell$",{"2":{"122":1}}],["shellpip",{"2":{"100":1}}],["shelluos",{"2":{"98":1,"107":1}}],["shellautotest",{"2":{"79":1,"123":1}}],["shell",{"0":{"68":1},"2":{"22":1,"25":1,"66":1,"68":2}}],["str",{"2":{"40":6}}],["step",{"2":{"18":1}}],["static",{"2":{"123":1,"128":1}}],["staticmethod",{"2":{"40":14}}],["status",{"2":{"40":2,"126":1}}],["start",{"2":{"21":2,"22":3,"24":1,"88":2}}],["startswith",{"2":{"17":1}}],["stage",{"2":{"12":3}}],["send2pms",{"2":{"88":2}}],["secret",{"2":{"33":1}}],["setting",{"2":{"17":5,"40":6,"118":2}}],["setattr",{"2":{"16":1}}],["setup",{"2":{"12":1}}],["self",{"2":{"15":1,"18":1,"39":3,"55":4,"78":2,"125":1,"126":2,"127":1}}],["汇总信息",{"2":{"10":1}}],["false",{"2":{"40":11,"47":2}}],["fail",{"2":{"12":2}}],["failed",{"2":{"10":1,"12":1}}],["float",{"2":{"40":13}}],["f",{"2":{"18":1,"40":34,"83":6}}],["fixed",{"2":{"42":1,"48":3,"49":1}}],["fixture",{"2":{"4":1,"123":1}}],["filter",{"2":{"40":2}}],["file",{"2":{"40":14,"55":2,"64":1,"98":2,"99":2,"100":1,"107":2,"108":1,"125":1,"126":2}}],["filecopyrighttext",{"2":{"40":1}}],["first=return",{"2":{"40":2}}],["first=false",{"2":{"40":2}}],["first",{"2":{"40":3}}],["find",{"2":{"18":4,"40":6,"61":1,"62":1,"63":1,"64":1}}],["from",{"2":{"18":2,"39":3,"40":14,"55":2,"108":1,"125":2,"126":2,"127":3}}],["funnylog2",{"2":{"94":1}}],["funnylog",{"2":{"17":1}}],["func",{"2":{"16":1}}],["foo0",{"2":{"12":1}}],["foo",{"2":{"9":1,"12":3,"13":2}}],["2024",{"2":{"110":1}}],["2021",{"2":{"110":1}}],["2023",{"2":{"40":1,"110":1}}],["28",{"2":{"18":1}}],["22",{"2":{"9":1}}],["2",{"0":{"46":1,"97":1,"98":1,"99":2,"106":1,"107":1,"108":2,"111":1,"114":1,"118":1,"124":1,"125":1,"126":2,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1},"1":{"98":1,"99":1,"107":1,"108":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"134":1,"135":1,"136":1},"2":{"9":1,"10":2,"27":3,"40":1,"43":1,"53":2,"78":1,"92":1,"93":2,"94":1,"110":2,"123":1}}],["55",{"2":{"55":1}}],["50",{"2":{"12":1,"93":1}}],["5",{"0":{"102":1,"121":1,"129":1,"133":1},"1":{"134":1,"135":1,"136":1},"2":{"9":2,"27":3,"94":1,"110":1}}],["56",{"2":{"9":1}}],["wdotool",{"2":{"94":1}}],["w5821",{"2":{"46":1}}],["widget",{"2":{"40":18,"55":1}}],["with",{"2":{"9":1}}],["web",{"2":{"70":1,"94":2,"134":1}}],["webassert",{"2":{"39":2}}],["webui",{"2":{"39":1,"72":2}}],["wayland",{"2":{"46":1,"47":1,"94":1}}],["want",{"2":{"22":1,"25":1}}],["warnings",{"0":{"13":1},"2":{"8":2}}],["what",{"2":{"22":1,"25":1}}],["x11",{"2":{"46":1}}],["xdg",{"2":{"46":1,"47":1}}],["xdist",{"2":{"9":1}}],["x3c",{"2":{"40":17}}],["x",{"2":{"18":2,"40":4}}],["xxx",{"2":{"15":1,"17":3,"18":1,"39":1,"42":3,"45":1,"48":2,"78":7}}],["xxxx",{"2":{"6":1,"88":4}}],["xpassed",{"2":{"10":1}}],["xfailed",{"2":{"10":1}}],["x86",{"2":{"9":1,"18":1,"46":2}}],["9",{"2":{"9":1,"18":2,"94":1}}],["7",{"0":{"131":1},"2":{"55":1,"94":1}}],["78",{"2":{"9":1}}],["7981803",{"2":{"8":1}}],["40",{"2":{"40":6}}],["47",{"2":{"18":1}}],["48",{"2":{"18":1}}],["4",{"0":{"101":1,"116":1,"117":1,"118":1,"119":1,"120":2,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":2,"129":1,"130":1,"131":1,"132":1},"1":{"117":1,"118":1,"119":1,"120":1,"121":1,"123":1,"124":1,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"134":1,"135":1,"136":1},"2":{"9":3,"94":1}}],["679537",{"2":{"45":1,"48":1,"49":1}}],["64",{"2":{"9":1,"18":1,"27":2,"46":2}}],["6",{"0":{"103":1,"130":1},"2":{"9":2,"18":1,"40":2,"94":1}}],["3",{"0":{"47":1,"100":1,"112":1,"113":1,"114":1,"115":2,"116":1,"117":1,"118":1,"119":2,"120":1,"121":1,"127":1},"1":{"113":1,"114":1,"115":1,"116":1,"117":2,"118":2,"119":2,"120":2,"121":2},"2":{"9":2,"10":1,"94":1}}],["cd",{"2":{"111":1}}],["ci",{"2":{"111":1}}],["center",{"2":{"94":1}}],["c",{"2":{"93":2}}],["cpu",{"2":{"46":3}}],["csv文件",{"2":{"43":1}}],["csv文件与脚本对应关系",{"0":{"43":1}}],["csv",{"2":{"42":1,"43":6,"44":2,"45":1,"46":1,"50":1,"81":1,"107":2,"123":1,"129":2}}],["ch",{"2":{"40":2}}],["cmd",{"2":{"31":3,"32":3,"33":3,"35":1,"36":1,"37":1,"40":4}}],["cli",{"2":{"110":1}}],["click",{"2":{"15":1,"18":1,"55":3,"60":2,"61":1,"62":1,"63":1,"64":1,"125":2,"126":1}}],["clone",{"2":{"22":1,"25":1}}],["cls",{"2":{"18":2,"40":1}}],["classmethod",{"2":{"18":1,"40":1}}],["class",{"2":{"13":1,"17":3,"18":2,"39":2,"40":1,"55":1,"78":1,"125":1,"126":1,"127":3}}],["cargo",{"0":{"67":1},"2":{"66":1,"67":2,"75":1,"77":1,"78":2,"79":1,"80":1,"81":1,"82":1,"83":3,"88":1,"90":1,"93":1}}],["cache",{"2":{"40":5}}],["case",{"2":{"21":2,"24":2,"39":2,"79":2,"80":1,"83":8,"107":3,"108":1,"123":4,"125":1,"126":3,"127":3}}],["cannot",{"2":{"13":1}}],["call",{"2":{"12":1}}],["c1",{"2":{"13":1}}],["commit",{"2":{"94":2}}],["count",{"2":{"40":1}}],["co",{"2":{"40":1}}],["coding",{"2":{"40":1}}],["code",{"2":{"13":1}}],["contain",{"2":{"17":1}}],["conftest",{"2":{"123":1}}],["config",{"2":{"18":1,"55":2,"64":1,"107":1,"123":1}}],["conf",{"2":{"17":1}}],["constructor",{"2":{"13":1}}],["collect",{"2":{"13":1}}],["collected",{"2":{"10":1}}],["collectors",{"0":{"11":1},"2":{"8":2}}],["created",{"2":{"8":1}}],["equal",{"2":{"40":2}}],["ele",{"2":{"125":1}}],["elementnotfound",{"2":{"40":1}}],["element",{"2":{"18":2,"40":8,"55":1,"61":1,"62":1,"63":1,"64":1}}],["elements",{"2":{"18":5}}],["elif",{"2":{"40":4}}],["else",{"2":{"40":8}}],["events=",{"2":{"33":1}}],["expr",{"2":{"40":10}}],["expanduser",{"2":{"40":2}}],["expect",{"2":{"33":1,"37":1,"40":18}}],["expect交互",{"0":{"33":1,"37":1}}],["excel",{"2":{"50":1}}],["except",{"2":{"40":5}}],["exceptions",{"2":{"40":10}}],["exc",{"2":{"40":6}}],["exists",{"2":{"40":2}}],["exist",{"2":{"40":11}}],["exitcode",{"2":{"8":1}}],["envx",{"2":{"66":2}}],["env",{"2":{"40":1,"107":1,"123":1}}],["environment",{"0":{"9":1},"2":{"8":2}}],["end",{"2":{"24":1,"25":3,"88":2}}],["endswith",{"2":{"17":1}}],["error",{"2":{"10":1,"17":1}}],["titlemethod",{"2":{"125":1}}],["timeout=timeout",{"2":{"40":4}}],["timeout",{"2":{"40":5}}],["time",{"2":{"27":1,"40":4}}],["task",{"2":{"88":4}}],["tags",{"0":{"85":1},"2":{"43":1,"84":1,"85":2,"88":2}}],["t",{"2":{"81":2,"82":2}}],["type",{"2":{"46":1,"47":1}}],["typing",{"2":{"40":1}}],["txtid1",{"2":{"85":1,"86":1}}],["txt",{"0":{"85":1,"86":1},"2":{"40":3,"84":3,"85":2,"86":2,"88":2,"92":1,"107":1,"123":1}}],["transfer",{"2":{"94":1}}],["trace",{"2":{"16":2}}],["true",{"2":{"40":4,"47":2,"126":1}}],["try",{"2":{"40":4}}],["tuple",{"2":{"18":1,"40":2}}],["templateelementfound",{"2":{"40":3}}],["templateelementnotfound",{"2":{"40":5}}],["technology",{"2":{"40":1}}],["teardown",{"2":{"12":1}}],["testmusic",{"2":{"80":1}}],["testmycase",{"2":{"39":1,"126":1}}],["testcase",{"2":{"78":1,"127":1}}],["testfoo",{"2":{"13":2}}],["test",{"2":{"12":8,"13":3,"39":1,"43":2,"62":1,"78":7,"79":2,"80":2,"83":6,"107":2,"123":2,"126":2,"127":2}}],["tests",{"0":{"12":1},"2":{"8":3,"13":1,"98":1}}],["toolkit",{"2":{"96":1,"98":1}}],["todo",{"2":{"37":1}}],["total",{"2":{"10":1}}],["to",{"2":{"8":1,"13":1}}],["public",{"0":{"103":1},"2":{"103":4}}],["pr",{"2":{"101":2}}],["project",{"2":{"55":2}}],["product",{"2":{"46":1}}],["process",{"2":{"40":4,"126":1}}],["pdocr",{"2":{"94":1}}],["pms",{"2":{"88":14,"94":2}}],["pms用例驱动",{"0":{"88":1}}],["pip",{"2":{"72":1,"100":1}}],["picture",{"2":{"40":13}}],["pic",{"2":{"18":1,"40":14}}],["png",{"2":{"18":2,"40":4,"62":1}}],["playwright",{"2":{"94":2}}],["platform",{"2":{"9":1,"46":5,"47":1}}],["plugins",{"2":{"9":1}}],["pluggy",{"2":{"9":1}}],["pypi",{"2":{"100":1}}],["pydbussend",{"2":{"94":1}}],["pylinuxauto",{"2":{"40":14,"56":1,"59":1,"60":1,"94":1,"108":1}}],["py",{"2":{"9":1,"12":2,"13":2,"18":2,"21":2,"22":1,"24":2,"25":1,"39":3,"43":2,"47":2,"48":1,"55":1,"78":2,"79":4,"80":2,"83":6,"98":6,"107":12,"123":11,"125":1,"126":1,"127":4}}],["pytest",{"2":{"9":1,"44":1,"81":2,"94":3,"107":1}}],["pythonpylinuxauto",{"2":{"60":1,"61":1,"62":1,"63":1,"64":1}}],["python3",{"2":{"22":1,"25":1,"40":1}}],["pythondfmwidget",{"2":{"18":1}}],["pythonfrom",{"2":{"17":1,"27":2,"31":1,"32":1,"33":1,"35":1,"36":1,"37":1,"59":1,"99":1,"100":1,"108":1}}],["pythonclass",{"2":{"15":1,"39":1}}],["python",{"2":{"9":1,"18":2,"39":2,"40":1,"55":1,"78":1,"111":1,"113":1,"125":1,"126":1,"127":3}}],["pause=pause",{"2":{"40":4}}],["pause",{"2":{"40":8}}],["pass",{"2":{"40":4}}],["password=",{"2":{"55":1}}],["password=password",{"2":{"55":1}}],["password2",{"2":{"53":1}}],["password1",{"2":{"53":2}}],["password",{"2":{"33":1,"35":1,"36":1,"37":1,"55":1,"88":4}}],["passed",{"2":{"10":1}}],["param",{"2":{"18":2,"40":32}}],["packages",{"2":{"9":1}}],["path=",{"2":{"64":1}}],["path",{"2":{"8":1,"13":2,"18":1,"40":17,"55":1,"61":1}}],["popmethod",{"2":{"125":1}}],["po",{"2":{"4":1,"51":1,"99":1,"113":1,"125":1}}],["rightmethod",{"2":{"125":1}}],["rm",{"0":{"69":1},"2":{"66":1,"69":1}}],["rpcgui",{"0":{"55":1},"2":{"55":2}}],["rpc",{"2":{"52":2,"55":1,"94":6}}],["raise",{"2":{"40":19}}],["rate=rate",{"2":{"40":2}}],["rate=0",{"2":{"18":1}}],["rate",{"2":{"18":1,"40":7}}],["run",{"2":{"22":2,"25":2,"31":1,"32":1,"33":1,"35":1,"36":1,"37":1,"48":1,"53":1,"65":1,"67":1,"68":1,"75":3,"77":2,"78":4,"79":2,"80":2,"81":2,"82":2,"83":6,"88":2}}],["requirements",{"2":{"107":1,"123":1}}],["readme",{"2":{"98":1,"107":1}}],["record",{"2":{"94":1}}],["recursive",{"2":{"40":1}}],["removed",{"2":{"42":1,"49":2}}],["remotemethod",{"2":{"55":2}}],["remote",{"2":{"35":1,"36":1,"37":1,"55":1,"72":1,"90":3,"93":2}}],["remotecmd",{"2":{"35":2,"36":2,"37":2}}],["retry=network",{"2":{"40":4}}],["retry",{"2":{"40":9}}],["return",{"2":{"18":2,"40":6}}],["restart",{"2":{"55":2,"90":1}}],["restart=false",{"2":{"55":1}}],["res",{"2":{"18":1,"40":21,"123":3,"128":3}}],["report",{"2":{"6":2,"94":1}}],["rootdir",{"2":{"55":1}}],["root",{"2":{"8":1,"53":3}}],["18",{"2":{"94":1}}],["16",{"2":{"94":1}}],["168",{"2":{"53":3}}],["15",{"2":{"94":1}}],["1518371686",{"2":{"8":1}}],["14",{"2":{"94":1}}],["13",{"2":{"94":1}}],["12",{"2":{"94":1}}],["123456",{"2":{"88":4}}],["1235666275024414",{"2":{"8":1}}],["11",{"2":{"94":1}}],["192",{"2":{"53":3}}],["17",{"2":{"18":1,"94":1}}],["1071",{"2":{"100":1}}],["1070",{"2":{"100":1}}],["100",{"2":{"93":3}}],["10",{"2":{"10":2,"55":1,"94":1}}],["1",{"0":{"45":1,"96":1,"98":1,"105":1,"107":1,"110":1,"113":1,"117":1,"123":1,"125":1},"2":{"8":1,"9":4,"10":3,"27":3,"40":7,"43":1,"53":5,"55":1,"78":3,"94":1,"110":1,"123":1}}],["002",{"2":{"79":1,"83":2,"123":1}}],["001",{"2":{"18":2,"39":2,"42":1,"43":2,"46":1,"78":7,"79":1,"80":5,"83":4,"107":2,"123":1,"126":2,"127":2}}],["02",{"2":{"18":1}}],["0",{"2":{"8":1,"9":4,"18":1,"40":1,"110":2}}],["报告中",{"2":{"18":1}}],["报告内容",{"0":{"7":1},"1":{"8":1,"9":1,"10":1,"11":1,"12":1,"13":1}}],["报告",{"0":{"6":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1},"2":{"6":1}}],["介绍自动化用例工程配置模块如何管理配置",{"2":{"4":1}}],["官方提供的脚手架工具",{"2":{"4":1}}],["使用更简单方便",{"2":{"111":1}}],["使用的框架不同",{"2":{"103":1}}],["使用框架的后置钩子触发结果回填到",{"2":{"88":1}}],["使用框架的前置钩子触发爬取动作生成",{"2":{"88":1}}],["使用逻辑表达式的时候一定要加引号",{"2":{"80":1,"82":1}}],["使用脚手架功能创建用例工程",{"2":{"51":1,"73":1}}],["使用子命令",{"2":{"51":1}}],["使用说明",{"0":{"42":1,"58":1},"1":{"59":1,"60":1,"61":1,"62":1,"63":1,"64":1}}],["使用方法很简单",{"2":{"18":1}}],["使用方法",{"0":{"18":1}}],["使用",{"2":{"4":2,"46":1,"47":1,"100":1,"113":1}}],["依赖管理文件",{"0":{"131":1},"2":{"123":1}}],["依赖管理",{"0":{"0":1},"2":{"4":1}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/@localSearchIndexroot.DmiiTrvV.js b/assets/chunks/@localSearchIndexroot.DmiiTrvV.js new file mode 100644 index 0000000..0993c1f --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.DmiiTrvV.js @@ -0,0 +1 @@ +const t='{"documentCount":156,"nextId":156,"documentIds":{"0":"/youqu3/实践/依赖管理.html#依赖管理","1":"/youqu3/实践/工程创建.html#工程创建","2":"/youqu3/实践/方法开发.html#方法开发","3":"/youqu3/实践/方法开发.html#方法模块路径","4":"/youqu3/实践/方法开发.html#以-dde-dock-方法举例","5":"/youqu3/实践/方法开发.html#实践规范","6":"/youqu3/实践/方法开发.html#方法文件名称","7":"/youqu3/实践/方法开发.html#类名称","8":"/youqu3/实践/方法开发.html#方法名称","9":"/youqu3/实践/方法开发.html#函数注释","10":"/youqu3/实践/方法开发.html#日志","11":"/youqu3/实践/用例开发.html#用例开发","12":"/youqu3/实践/用例开发.html#用例模块路径","13":"/youqu3/实践/用例开发.html#以-dde-file-manager-用例举例","14":"/youqu3/实践/用例开发.html#实践规范","15":"/youqu3/实践/用例开发.html#用例文件名称","16":"/youqu3/实践/用例开发.html#类名称","17":"/youqu3/实践/用例开发.html#用例函数","18":"/youqu3/实践/用例开发.html#用例注释","19":"/youqu3/实践/用例开发.html#csv文件","20":"/youqu3/实践/简介.html#从零开始构建自动化工程","21":"/youqu3/实践/配置模块.html#配置模块","22":"/youqu3/实践/配置模块.html#配置模块路径","23":"/youqu3/实践/配置模块.html#代码中调用","24":"/youqu3/实践/配置模块.html#调用youqu3的配置","25":"/youqu3/指南/与生俱来/JSON报告.html#json-报告","26":"/youqu3/指南/与生俱来/JSON报告.html#报告内容","27":"/youqu3/指南/与生俱来/JSON报告.html#整体结构","28":"/youqu3/指南/与生俱来/JSON报告.html#environment","29":"/youqu3/指南/与生俱来/JSON报告.html#summary","30":"/youqu3/指南/与生俱来/JSON报告.html#collectors","31":"/youqu3/指南/与生俱来/JSON报告.html#tests","32":"/youqu3/指南/与生俱来/JSON报告.html#warnings","33":"/youqu3/指南/与生俱来/全自动日志.html#全自动日志","34":"/youqu3/指南/与生俱来/全自动日志.html#背景","35":"/youqu3/指南/与生俱来/全自动日志.html#实现原理","36":"/youqu3/指南/与生俱来/全自动日志.html#日志配置","37":"/youqu3/指南/与生俱来/全自动日志.html#使用方法","38":"/youqu3/指南/与生俱来/前后钩子.html#前后钩子","39":"/youqu3/指南/与生俱来/前后钩子.html#前置钩子","40":"/youqu3/指南/与生俱来/前后钩子.html#前置脚本钩子","41":"/youqu3/指南/与生俱来/前后钩子.html#前置命令行入参钩子","42":"/youqu3/指南/与生俱来/前后钩子.html#后置钩子","43":"/youqu3/指南/与生俱来/前后钩子.html#后置脚本钩子","44":"/youqu3/指南/与生俱来/前后钩子.html#后置命令行入参钩子","45":"/youqu3/指南/与生俱来/动态等待.html#动态等待","46":"/youqu3/指南/与生俱来/动态等待.html#架构动态等待","47":"/youqu3/指南/与生俱来/动态等待.html#元素识别动态等待","48":"/youqu3/指南/与生俱来/命令行交互.html#命令行交互","49":"/youqu3/指南/与生俱来/命令行交互.html#本机命令行交互","50":"/youqu3/指南/与生俱来/命令行交互.html#普通权限执行","51":"/youqu3/指南/与生俱来/命令行交互.html#sudo权限执行","52":"/youqu3/指南/与生俱来/命令行交互.html#expect交互","53":"/youqu3/指南/与生俱来/命令行交互.html#远程命令行交互","54":"/youqu3/指南/与生俱来/命令行交互.html#普通权限执行-1","55":"/youqu3/指南/与生俱来/命令行交互.html#sudo权限执行-1","56":"/youqu3/指南/与生俱来/命令行交互.html#expect交互-1","57":"/youqu3/指南/与生俱来/断言语句.html#断言语句","58":"/youqu3/指南/与生俱来/断言语句.html#用例中使用方法","59":"/youqu3/指南/与生俱来/断言语句.html#方法明细","60":"/youqu3/指南/与生俱来/标签化管理.html#标签化管理","61":"/youqu3/指南/与生俱来/标签化管理.html#使用说明","62":"/youqu3/指南/与生俱来/标签化管理.html#csv文件与脚本对应关系","63":"/youqu3/指南/与生俱来/标签化管理.html#跳过用例","64":"/youqu3/指南/与生俱来/标签化管理.html#_1-固定跳过","65":"/youqu3/指南/与生俱来/标签化管理.html#_2-条件判断跳过","66":"/youqu3/指南/与生俱来/标签化管理.html#_3-自定义跳过","67":"/youqu3/指南/与生俱来/标签化管理.html#确认修复","68":"/youqu3/指南/与生俱来/标签化管理.html#废弃用例","69":"/youqu3/指南/与生俱来/标签化管理.html#文件格式","70":"/youqu3/指南/与生俱来/脚手架工具.html#脚手架工具","71":"/youqu3/指南/与生俱来/远程交互控制.html#远程交互式控制","72":"/youqu3/指南/与生俱来/远程交互控制.html#slaves对象提供远程机器信息","73":"/youqu3/指南/与生俱来/远程交互控制.html#ui操作远程对象","74":"/youqu3/指南/与生俱来/远程交互控制.html#rpcgui","75":"/youqu3/指南/可选功能/GUI自动化.html#gui-自动化","76":"/youqu3/指南/可选功能/GUI自动化.html#安装","77":"/youqu3/指南/可选功能/GUI自动化.html#使用说明","78":"/youqu3/指南/可选功能/GUI自动化.html#导入","79":"/youqu3/指南/可选功能/GUI自动化.html#键鼠控制","80":"/youqu3/指南/可选功能/GUI自动化.html#属性定位","81":"/youqu3/指南/可选功能/GUI自动化.html#图像识别","82":"/youqu3/指南/可选功能/GUI自动化.html#ocr识别","83":"/youqu3/指南/可选功能/GUI自动化.html#相对位移定位","84":"/youqu3/指南/环境管理/原生环境.html#原生环境","85":"/youqu3/指南/环境管理/虚拟环境.html#虚拟环境","86":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-cargo","87":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-shell","88":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-rm","89":"/youqu3/指南/简介/YouQu3是什么.html#youqu3-能做什么","90":"/youqu3/指南/简介/快速开始.html#快速开始","91":"/youqu3/指南/简介/快速开始.html#安装","92":"/youqu3/指南/简介/快速开始.html#创建用例工程","93":"/youqu3/指南/驱动执行/本地执行.html#本地执行","94":"/youqu3/指南/驱动执行/本地执行.html#子命令","95":"/youqu3/指南/驱动执行/本地执行.html#用例驱动方式","96":"/youqu3/指南/驱动执行/本地执行.html#执行所有用例","97":"/youqu3/指南/驱动执行/本地执行.html#指定执行某一个用例","98":"/youqu3/指南/驱动执行/本地执行.html#指定某个目录执行","99":"/youqu3/指南/驱动执行/本地执行.html#根据关键词执行","100":"/youqu3/指南/驱动执行/本地执行.html#根据标签执行","101":"/youqu3/指南/驱动执行/本地执行.html#批量用例id驱动执行","102":"/youqu3/指南/驱动执行/本地执行.html#指定用例文件路径执行","103":"/youqu3/指南/驱动执行/自定义执行.html#自定义执行","104":"/youqu3/指南/驱动执行/自定义执行.html#youqu-tags-txt","105":"/youqu3/指南/驱动执行/自定义执行.html#youqu-keywords-txt","106":"/youqu3/指南/驱动执行/自定义执行.html#案例","107":"/youqu3/指南/驱动执行/自定义执行.html#pms用例驱动","108":"/youqu3/指南/驱动执行/远程执行.html#远程执行","109":"/youqu3/指南/驱动执行/远程执行.html#子命令","110":"/youqu3/指南/驱动执行/远程执行.html#远程测试机分组策略","111":"/youqu3/指南/驱动执行/远程执行.html#分组规则","112":"/youqu3/指南/驱动执行/远程执行.html#执行策略","113":"/youqu3/规划/UOS自动化测试方法套件.html#uos-自动化测试方法套件-umtk","114":"/youqu3/规划/UOS自动化测试方法套件.html#_1-简介","115":"/youqu3/规划/UOS自动化测试方法套件.html#_2-工程设计","116":"/youqu3/规划/UOS自动化测试方法套件.html#_2-1-工程结构","117":"/youqu3/规划/UOS自动化测试方法套件.html#_2-2-方案说明","118":"/youqu3/规划/UOS自动化测试方法套件.html#_3-套件发布","119":"/youqu3/规划/UOS自动化测试方法套件.html#_4-套件维护","120":"/youqu3/规划/UOS自动化测试方法套件.html#_5-对套件的测试","121":"/youqu3/规划/UOS自动化测试方法套件.html#_6-umtk-和-youqu2-的公共方法库-public-有何区别","122":"/youqu3/插件/插件列表.html#youqu3-插件汇总信息","123":"/youqu3/规划/UOS自动化测试用例.html#uos-自动化测试用例","124":"/youqu3/规划/UOS自动化测试用例.html#_1-简介","125":"/youqu3/规划/UOS自动化测试用例.html#_2-工程设计","126":"/youqu3/规划/UOS自动化测试用例.html#_2-1-工程结构","127":"/youqu3/规划/UOS自动化测试用例.html#_2-2-方案说明","128":"/youqu3/规划/YouQu3架构设计规划.html#youqu3-架构设计规划","129":"/youqu3/规划/YouQu3架构设计规划.html#_1-背景","130":"/youqu3/规划/YouQu3架构设计规划.html#_2-目标","131":"/youqu3/规划/YouQu3架构设计规划.html#_3-架构设计","132":"/youqu3/规划/YouQu3架构设计规划.html#_3-1-总体方案","133":"/youqu3/规划/YouQu3架构设计规划.html#_3-2-架构设计","134":"/youqu3/规划/YouQu3架构设计规划.html#_3-3-整体数据流","135":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-详细设计","136":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-1-驱动执行管理","137":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-2-配置项管理","138":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-3-框架总线接口","139":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-4-按测试类型管理插件","140":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-5-环境依赖管理","141":"/youqu3/规划/YouQu3架构设计规划.html#_4-用例工程设计","142":"/youqu3/规划/YouQu3架构设计规划.html#_4-1-用例工程结构","143":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-各模块编写思路","144":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-1-方法层","145":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-2-用例层","146":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-3-断言","147":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-4-配置对象","148":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-5-用例标签管理文件","149":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-6-默认环境变量管理文件","150":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-7-依赖管理文件","151":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-8-调试用例驱动","152":"/youqu3/规划/YouQu3架构设计规划.html#_5-演进规划","153":"/youqu3/规划/YouQu3架构设计规划.html#可视化配置","154":"/youqu3/规划/YouQu3架构设计规划.html#非开发者下运行","155":"/youqu3/规划/YouQu3架构设计规划.html#过程钩子"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,1],"1":[1,1,9],"2":[1,1,1],"3":[1,1,34],"4":[4,1,44],"5":[1,1,1],"6":[1,2,8],"7":[1,2,8],"8":[1,2,39],"9":[1,2,4],"10":[1,2,18],"11":[1,1,1],"12":[1,1,35],"13":[5,1,45],"14":[1,1,1],"15":[1,2,10],"16":[1,2,10],"17":[1,2,6],"18":[1,2,9],"19":[1,2,7],"20":[1,1,22],"21":[1,1,1],"22":[1,1,48],"23":[1,1,5],"24":[1,1,7],"25":[2,1,8],"26":[1,2,1],"27":[1,3,23],"28":[1,3,31],"29":[1,3,15],"30":[1,3,4],"31":[1,3,21],"32":[1,3,23],"33":[1,1,1],"34":[1,1,41],"35":[1,1,24],"36":[1,1,27],"37":[1,1,102],"38":[1,1,3],"39":[1,1,1],"40":[1,2,11],"41":[1,2,24],"42":[1,1,1],"43":[1,2,12],"44":[1,2,24],"45":[1,1,1],"46":[1,1,21],"47":[1,1,1],"48":[1,1,1],"49":[1,1,1],"50":[1,2,8],"51":[1,2,11],"52":[1,2,18],"53":[1,1,1],"54":[1,2,13],"55":[1,2,15],"56":[1,2,17],"57":[1,1,4],"58":[1,1,35],"59":[1,1,251],"60":[1,1,1],"61":[1,1,13],"62":[1,1,50],"63":[1,1,14],"64":[2,2,18],"65":[2,2,62],"66":[2,2,41],"67":[1,1,33],"68":[1,1,21],"69":[1,1,8],"70":[1,1,15],"71":[1,1,13],"72":[1,1,21],"73":[1,1,1],"74":[1,2,57],"75":[2,1,7],"76":[1,2,5],"77":[1,2,1],"78":[1,3,6],"79":[1,3,6],"80":[1,3,13],"81":[1,3,12],"82":[1,3,9],"83":[1,3,20],"84":[1,1,11],"85":[1,1,22],"86":[2,1,6],"87":[2,1,12],"88":[2,1,4],"89":[3,1,18],"90":[1,1,1],"91":[1,1,18],"92":[1,1,9],"93":[1,1,1],"94":[1,1,7],"95":[1,1,1],"96":[1,2,6],"97":[1,2,21],"98":[1,2,25],"99":[1,2,30],"100":[1,2,24],"101":[1,2,15],"102":[1,2,21],"103":[1,1,8],"104":[3,1,14],"105":[3,1,14],"106":[1,1,1],"107":[1,2,31],"108":[1,1,1],"109":[1,1,18],"110":[1,1,1],"111":[1,2,17],"112":[1,2,32],"113":[4,1,1],"114":[2,4,18],"115":[2,4,1],"116":[3,5,20],"117":[2,5,21],"118":[2,4,33],"119":[2,4,8],"120":[2,4,9],"121":[7,4,50],"122":[2,1,92],"123":[2,1,1],"124":[2,2,12],"125":[2,2,1],"126":[3,4,29],"127":[2,4,24],"128":[2,1,1],"129":[2,2,56],"130":[2,2,46],"131":[2,2,1],"132":[3,4,37],"133":[3,4,1],"134":[2,4,15],"135":[3,4,2],"136":[4,6,16],"137":[4,6,19],"138":[3,6,12],"139":[3,6,4],"140":[4,6,5],"141":[2,2,5],"142":[3,4,49],"143":[3,4,2],"144":[4,6,53],"145":[3,6,32],"146":[4,6,30],"147":[3,6,13],"148":[4,6,9],"149":[4,6,4],"150":[4,6,2],"151":[4,6,5],"152":[2,2,1],"153":[1,7,6],"154":[1,7,4],"155":[1,7,5]},"averageFieldLength":[1.6217948717948723,2.2884615384615388,17.692307692307683],"storedFields":{"0":{"title":"依赖管理","titles":[]},"1":{"title":"工程创建","titles":[]},"2":{"title":"方法开发","titles":[]},"3":{"title":"方法模块路径","titles":["方法开发"]},"4":{"title":"以 dde-dock 方法举例","titles":["方法开发"]},"5":{"title":"实践规范","titles":["方法开发"]},"6":{"title":"方法文件名称","titles":["方法开发","实践规范"]},"7":{"title":"类名称","titles":["方法开发","实践规范"]},"8":{"title":"方法名称","titles":["方法开发","实践规范"]},"9":{"title":"函数注释","titles":["方法开发","实践规范"]},"10":{"title":"日志","titles":["方法开发","实践规范"]},"11":{"title":"用例开发","titles":[]},"12":{"title":"用例模块路径","titles":["用例开发"]},"13":{"title":"以 dde-file-manager 用例举例","titles":["用例开发"]},"14":{"title":"实践规范","titles":["用例开发"]},"15":{"title":"用例文件名称","titles":["用例开发","实践规范"]},"16":{"title":"类名称","titles":["用例开发","实践规范"]},"17":{"title":"用例函数","titles":["用例开发","实践规范"]},"18":{"title":"用例注释","titles":["用例开发","实践规范"]},"19":{"title":"CSV文件","titles":["用例开发","实践规范"]},"20":{"title":"从零开始构建自动化工程","titles":[]},"21":{"title":"配置模块","titles":[]},"22":{"title":"配置模块路径","titles":["配置模块"]},"23":{"title":"代码中调用","titles":["配置模块"]},"24":{"title":"调用YouQu3的配置","titles":["配置模块"]},"25":{"title":"JSON 报告","titles":[]},"26":{"title":"报告内容","titles":["JSON 报告"]},"27":{"title":"整体结构","titles":["JSON 报告","报告内容"]},"28":{"title":"Environment","titles":["JSON 报告","报告内容"]},"29":{"title":"Summary","titles":["JSON 报告","报告内容"]},"30":{"title":"Collectors","titles":["JSON 报告","报告内容"]},"31":{"title":"Tests","titles":["JSON 报告","报告内容"]},"32":{"title":"Warnings","titles":["JSON 报告","报告内容"]},"33":{"title":"全自动日志","titles":[]},"34":{"title":"背景","titles":["全自动日志"]},"35":{"title":"实现原理","titles":["全自动日志"]},"36":{"title":"日志配置","titles":["全自动日志"]},"37":{"title":"使用方法","titles":["全自动日志"]},"38":{"title":"前后钩子","titles":[]},"39":{"title":"前置钩子","titles":["前后钩子"]},"40":{"title":"前置脚本钩子","titles":["前后钩子","前置钩子"]},"41":{"title":"前置命令行入参钩子","titles":["前后钩子","前置钩子"]},"42":{"title":"后置钩子","titles":["前后钩子"]},"43":{"title":"后置脚本钩子","titles":["前后钩子","后置钩子"]},"44":{"title":"后置命令行入参钩子","titles":["前后钩子","后置钩子"]},"45":{"title":"动态等待","titles":[]},"46":{"title":"架构动态等待","titles":["动态等待"]},"47":{"title":"元素识别动态等待","titles":["动态等待"]},"48":{"title":"命令行交互","titles":[]},"49":{"title":"本机命令行交互","titles":["命令行交互"]},"50":{"title":"普通权限执行","titles":["命令行交互","本机命令行交互"]},"51":{"title":"sudo权限执行","titles":["命令行交互","本机命令行交互"]},"52":{"title":"expect交互","titles":["命令行交互","本机命令行交互"]},"53":{"title":"远程命令行交互","titles":["命令行交互"]},"54":{"title":"普通权限执行","titles":["命令行交互","远程命令行交互"]},"55":{"title":"sudo权限执行","titles":["命令行交互","远程命令行交互"]},"56":{"title":"expect交互","titles":["命令行交互","远程命令行交互"]},"57":{"title":"断言语句","titles":[]},"58":{"title":"用例中使用方法","titles":["断言语句"]},"59":{"title":"方法明细","titles":["断言语句"]},"60":{"title":"标签化管理","titles":[]},"61":{"title":"使用说明","titles":["标签化管理"]},"62":{"title":"CSV文件与脚本对应关系","titles":["标签化管理"]},"63":{"title":"跳过用例","titles":["标签化管理"]},"64":{"title":"1. 固定跳过","titles":["标签化管理","跳过用例"]},"65":{"title":"2. 条件判断跳过","titles":["标签化管理","跳过用例"]},"66":{"title":"3.自定义跳过","titles":["标签化管理","跳过用例"]},"67":{"title":"确认修复","titles":["标签化管理"]},"68":{"title":"废弃用例","titles":["标签化管理"]},"69":{"title":"文件格式","titles":["标签化管理"]},"70":{"title":"脚手架工具","titles":[]},"71":{"title":"远程交互式控制","titles":[]},"72":{"title":"slaves对象提供远程机器信息","titles":["远程交互式控制"]},"73":{"title":"UI操作远程对象","titles":["远程交互式控制"]},"74":{"title":"RpcGui","titles":["远程交互式控制","UI操作远程对象"]},"75":{"title":"GUI 自动化","titles":[]},"76":{"title":"安装","titles":["GUI 自动化"]},"77":{"title":"使用说明","titles":["GUI 自动化"]},"78":{"title":"导入","titles":["GUI 自动化","使用说明"]},"79":{"title":"键鼠控制","titles":["GUI 自动化","使用说明"]},"80":{"title":"属性定位","titles":["GUI 自动化","使用说明"]},"81":{"title":"图像识别","titles":["GUI 自动化","使用说明"]},"82":{"title":"OCR识别","titles":["GUI 自动化","使用说明"]},"83":{"title":"相对位移定位","titles":["GUI 自动化","使用说明"]},"84":{"title":"原生环境","titles":[]},"85":{"title":"虚拟环境","titles":[]},"86":{"title":"youqu3-cargo","titles":["虚拟环境"]},"87":{"title":"youqu3-shell","titles":["虚拟环境"]},"88":{"title":"youqu3-rm","titles":["虚拟环境"]},"89":{"title":"YouQu3 能做什么?","titles":[null]},"90":{"title":"快速开始","titles":[]},"91":{"title":"安装","titles":["快速开始"]},"92":{"title":"创建用例工程","titles":["快速开始"]},"93":{"title":"本地执行","titles":[]},"94":{"title":"子命令","titles":["本地执行"]},"95":{"title":"用例驱动方式","titles":["本地执行"]},"96":{"title":"执行所有用例","titles":["本地执行","用例驱动方式"]},"97":{"title":"指定执行某一个用例","titles":["本地执行","用例驱动方式"]},"98":{"title":"指定某个目录执行","titles":["本地执行","用例驱动方式"]},"99":{"title":"根据关键词执行","titles":["本地执行","用例驱动方式"]},"100":{"title":"根据标签执行","titles":["本地执行","用例驱动方式"]},"101":{"title":"批量用例ID驱动执行","titles":["本地执行","用例驱动方式"]},"102":{"title":"指定用例文件路径执行","titles":["本地执行","用例驱动方式"]},"103":{"title":"自定义执行","titles":[]},"104":{"title":"youqu-tags.txt","titles":["自定义执行"]},"105":{"title":"youqu-keywords.txt","titles":["自定义执行"]},"106":{"title":"案例","titles":["自定义执行"]},"107":{"title":"PMS用例驱动","titles":["自定义执行","案例"]},"108":{"title":"远程执行","titles":[]},"109":{"title":"子命令","titles":["远程执行"]},"110":{"title":"远程测试机分组策略","titles":["远程执行"]},"111":{"title":"分组规则","titles":["远程执行","远程测试机分组策略"]},"112":{"title":"执行策略","titles":["远程执行","远程测试机分组策略"]},"113":{"title":"UOS 自动化测试方法套件(UMTK)","titles":[]},"114":{"title":"1. 简介","titles":["UOS 自动化测试方法套件(UMTK)"]},"115":{"title":"2. 工程设计","titles":["UOS 自动化测试方法套件(UMTK)"]},"116":{"title":"2.1. 工程结构","titles":["UOS 自动化测试方法套件(UMTK)","2. 工程设计"]},"117":{"title":"2.2. 方案说明","titles":["UOS 自动化测试方法套件(UMTK)","2. 工程设计"]},"118":{"title":"3. 套件发布","titles":["UOS 自动化测试方法套件(UMTK)"]},"119":{"title":"4. 套件维护","titles":["UOS 自动化测试方法套件(UMTK)"]},"120":{"title":"5. 对套件的测试","titles":["UOS 自动化测试方法套件(UMTK)"]},"121":{"title":"6. UMTK 和 YouQu2 的公共方法库(public)有何区别","titles":["UOS 自动化测试方法套件(UMTK)"]},"122":{"title":"YouQu3 插件汇总信息","titles":[null]},"123":{"title":"UOS 自动化测试用例","titles":[]},"124":{"title":"1. 简介","titles":["UOS 自动化测试用例"]},"125":{"title":"2. 工程设计","titles":["UOS 自动化测试用例"]},"126":{"title":"2.1. 工程结构","titles":["UOS 自动化测试用例","2. 工程设计"]},"127":{"title":"2.2. 方案说明","titles":["UOS 自动化测试用例","2. 工程设计"]},"128":{"title":"YouQu3 架构设计规划","titles":[]},"129":{"title":"1. 背景","titles":["YouQu3 架构设计规划"]},"130":{"title":"2. 目标","titles":["YouQu3 架构设计规划"]},"131":{"title":"3. 架构设计","titles":["YouQu3 架构设计规划"]},"132":{"title":"3.1. 总体方案","titles":["YouQu3 架构设计规划","3. 架构设计"]},"133":{"title":"3.2. 架构设计","titles":["YouQu3 架构设计规划","3. 架构设计"]},"134":{"title":"3.3. 整体数据流","titles":["YouQu3 架构设计规划","3. 架构设计"]},"135":{"title":"3.4. 详细设计","titles":["YouQu3 架构设计规划","3. 架构设计"]},"136":{"title":"3.4.1. 驱动执行管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"137":{"title":"3.4.2. 配置项管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"138":{"title":"3.4.3. 框架总线接口","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"139":{"title":"3.4.4. 按测试类型管理插件","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"140":{"title":"3.4.5. 环境依赖管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"141":{"title":"4. 用例工程设计","titles":["YouQu3 架构设计规划"]},"142":{"title":"4.1. 用例工程结构","titles":["YouQu3 架构设计规划","4. 用例工程设计"]},"143":{"title":"4.2. 各模块编写思路","titles":["YouQu3 架构设计规划","4. 用例工程设计"]},"144":{"title":"4.2.1. 方法层","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"145":{"title":"4.2.2. 用例层","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"146":{"title":"4.2.3. 断言","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"147":{"title":"4.2.4. 配置对象","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"148":{"title":"4.2.5. 用例标签管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"149":{"title":"4.2.6. 默认环境变量管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"150":{"title":"4.2.7. 依赖管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"151":{"title":"4.2.8. 调试用例驱动","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"152":{"title":"5. 演进规划","titles":["YouQu3 架构设计规划"]},"153":{"title":"可视化配置","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]},"154":{"title":"非开发者下运行","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]},"155":{"title":"过程钩子","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]}},"dirtCount":0,"index":[["即可自动被框架加载并执行",{"2":{"155":1}}],["过程钩子",{"0":{"155":1}}],["过程中如果根据需要出小版本",{"2":{"118":1}}],["减少系统自动化环境准备的难度",{"2":{"154":1}}],["非开发者下运行",{"0":{"154":1}}],["配合远程执行功能",{"2":{"153":1}}],["配置对象",{"0":{"147":1}}],["配置文件管理配置项",{"2":{"137":1}}],["配置类",{"2":{"137":1,"147":1}}],["配置项管理",{"0":{"137":1},"2":{"137":1}}],["配置模块路径",{"0":{"22":1}}],["配置模块",{"0":{"21":1},"1":{"22":1,"23":1,"24":1},"2":{"20":1,"142":1}}],["页面化的配置功能",{"2":{"153":1}}],["演进规划",{"0":{"152":1},"1":{"153":1,"154":1,"155":1}}],["模式运行脚本",{"2":{"151":1}}],["模块",{"2":{"136":1}}],["模块化改造",{"2":{"130":1}}],["模块名称为应用包名",{"2":{"117":1,"127":1}}],["模块名称",{"2":{"99":1}}],["定义用例工程所需要的依赖包",{"2":{"150":1}}],["定义虚拟环境相关的一些环境变量",{"2":{"149":1}}],["运行的行为",{"2":{"149":1}}],["运行稳定性",{"2":{"130":1}}],["日常维护过程中",{"2":{"148":1}}],["日志模板语法",{"2":{"37":1}}],["日志配置",{"0":{"36":1}}],["日志",{"0":{"10":1}}],["维护标签时",{"2":{"148":1}}],["维护方法的稳定性有效性将成为一个问题",{"2":{"120":1}}],["然后",{"2":{"146":1}}],["然后将这些基础能力通过",{"2":{"71":1}}],["任务栏点击文件管理器",{"2":{"144":1}}],["任务栏右键启动文件管理器",{"2":{"13":1}}],["弹窗",{"2":{"144":1}}],["左边视图区域",{"2":{"144":1}}],["左键点击",{"2":{"8":1}}],["右边视图区域",{"2":{"144":1}}],["右键点击任务栏上的文件管理器",{"2":{"13":1}}],["右键点击",{"2":{"8":1}}],["标题栏",{"2":{"144":1}}],["标签驱动",{"2":{"132":1}}],["标签驱动支持",{"2":{"100":1}}],["标签",{"2":{"100":1}}],["标签记录为",{"2":{"65":1}}],["标签可以无序",{"2":{"62":1}}],["标签化管理",{"0":{"60":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1}}],["进行编写",{"2":{"144":1}}],["进行分割",{"2":{"66":1}}],["放置在对应的类里面",{"2":{"144":1}}],["调试用例驱动",{"0":{"151":1}}],["调试用例驱动脚本",{"2":{"142":1}}],["调用所有的断言语句",{"2":{"58":1}}],["调用方法时",{"2":{"37":1}}],["调用youqu3的配置",{"0":{"24":1}}],["按测试类型管理插件",{"0":{"139":1}}],["按照",{"2":{"144":1}}],["按照业务流程调用方法进行用例代码开发",{"2":{"20":1}}],["按照以下章节",{"2":{"20":1}}],["上层用例就能通过框架动态调用插件提供的功能",{"2":{"138":1}}],["插槽",{"2":{"138":1}}],["插件如果已经安装",{"2":{"138":1}}],["插件",{"2":{"134":1}}],["插件汇总信息",{"0":{"122":1}}],["原则上不通过修改配置文件的方式修改",{"2":{"137":1}}],["原生环境虚拟环境",{"2":{"94":1,"96":1,"97":2,"98":1,"99":1,"100":1,"101":1,"102":3,"107":1,"109":1,"112":1}}],["原生环境",{"0":{"84":1}}],["公共配置为框架提供的一些具有默认值的配置项",{"2":{"137":1}}],["公共配置的形式",{"2":{"137":1}}],["显示的传入参数值",{"2":{"137":1}}],["采用虚拟环境管理依赖项",{"2":{"140":1}}],["采用命令行参数",{"2":{"137":1}}],["采用全新的架构设计",{"2":{"121":1}}],["解析测试策略",{"2":{"136":1}}],["解除跳过时将装饰器代码删掉",{"2":{"63":1}}],["获取命令行参数并结合配置项",{"2":{"136":1}}],["获取被装饰的类下所有函数",{"2":{"35":1}}],["驱动",{"2":{"136":1}}],["驱动命令将命令行参数传递给框架底层",{"2":{"136":1}}],["驱动执行管理",{"0":{"136":1}}],["驱动执行",{"2":{"98":1}}],["详细介绍各功能模块的设计和编写思路",{"2":{"143":1}}],["详细描述各模块工作方式",{"2":{"135":1}}],["详细设计",{"0":{"135":1},"1":{"136":1,"137":1,"138":1,"139":1,"140":1}}],["抛异常程序终止",{"2":{"134":1}}],["否则提示用户进行安装",{"2":{"134":1}}],["否则会提示无法连接",{"2":{"109":1}}],["底层功能",{"2":{"134":1}}],["让用户能专注于用例逻辑的编写和维护",{"2":{"132":1}}],["让你可以专注于用例和方法的编写维护",{"2":{"70":1}}],["管理",{"2":{"132":1}}],["资源目录",{"2":{"132":1}}],["生成的用例工程遵循完整的",{"2":{"132":1}}],["路径驱动",{"2":{"132":1}}],["三方包的形式提供",{"2":{"132":1}}],["由用例层决定使用哪些功能对应安装哪些插件",{"2":{"132":1}}],["由于虚拟环境中也安装了",{"2":{"87":1}}],["由于需求变更",{"2":{"68":1}}],["总体方案",{"0":{"132":1}}],["互不影响",{"2":{"130":1}}],["安全性稳定性更好",{"2":{"130":1}}],["安装",{"0":{"76":1,"91":1},"2":{"118":1}}],["降低使用门槛",{"2":{"130":1}}],["价值",{"2":{"130":1}}],["简化系统环境部署",{"2":{"130":1}}],["简介",{"0":{"114":1,"124":1}}],["搭配远程执行功能",{"2":{"130":1}}],["功能插件可插拔",{"2":{"132":1}}],["功能扩展性更好",{"2":{"130":1}}],["功能可插拔",{"2":{"130":1}}],["功能强大的自动化测试框架",{"2":{"129":1}}],["极致轻量化",{"2":{"130":1}}],["诸多亮点功能的同时解决其遇到的问题",{"2":{"130":1}}],["扩展性和兼容性更好的自动化测试框架",{"2":{"129":1}}],["更贴合大部分真实用户的使用场景",{"2":{"154":1}}],["更新",{"2":{"130":1}}],["更加纯粹",{"2":{"129":1}}],["更重要的是我们不想引入三方依赖",{"2":{"69":1}}],["甚至有些问题在现有框架结构下根本无法解决",{"2":{"129":1}}],["业务流程有一些影响",{"2":{"129":1}}],["业务不同",{"2":{"121":1}}],["势必对现有公司自动化用例",{"2":{"129":1}}],["等等",{"2":{"129":1}}],["绑定了太多公司的业务",{"2":{"129":1}}],["导致框架代码容易被用户修改",{"2":{"129":1}}],["导入",{"0":{"78":1}}],["源代码暴露在用户面前",{"2":{"129":1}}],["每次使用需要初始化框架工程及单独做环境部署",{"2":{"129":1}}],["每个应用存在一个唯一的出口文件",{"2":{"117":1}}],["每个机器执行",{"2":{"112":1}}],["每个模块建立一个",{"2":{"62":1}}],["每个用例的详细结果",{"2":{"31":1}}],["仍然存在一些不尽人意的地方",{"2":{"129":1}}],["小版本更新了数十个",{"2":{"129":1}}],["小驼峰命名",{"2":{"6":1,"15":1}}],["两个大版本",{"2":{"129":1}}],["两对大括号中的内容",{"2":{"37":1}}],["月在欧拉社区开源",{"2":{"129":1}}],["月正式在",{"2":{"129":1}}],["社区开源",{"2":{"129":1}}],["年",{"2":{"129":2}}],["年多的持续开发优化",{"2":{"129":1}}],["年成都测试团队开始内部孵化的项目",{"2":{"129":1}}],["经过了",{"2":{"129":1}}],["旨在成为下一代",{"2":{"130":1}}],["旨在开发一个简单易用",{"2":{"129":1}}],["旨在提供",{"2":{"124":1}}],["旨在提供系统预装应用所有的元素的操作方法",{"2":{"114":1}}],["做复杂步骤的封装",{"2":{"127":1}}],["里面导入使用",{"2":{"127":1}}],["编写的",{"2":{"124":1}}],["迁移工具",{"2":{"122":1}}],["下完美的键鼠工具",{"2":{"122":1}}],["下划线连接单词",{"2":{"117":1,"127":1}}],["操控插件",{"2":{"122":1}}],["操作系统环境支持不够友好",{"2":{"129":1}}],["操作系统预装应用的元素操作方法套件",{"2":{"114":1}}],["操作较为复杂",{"2":{"129":1}}],["操作或命令行操作",{"2":{"71":1}}],["✔️",{"2":{"122":15}}],["大量人员都可以对其进行直接修改",{"2":{"121":1}}],["大驼峰命名",{"2":{"7":1,"16":1}}],["稳定性",{"2":{"121":2}}],["确保操作方法的一致性",{"2":{"121":1}}],["确认修复",{"0":{"67":1},"2":{"61":1,"62":1,"67":3,"68":1}}],["容易受到需求变更",{"2":{"121":1}}],["仅包含自动化用例用到的少部分公共方法",{"2":{"121":1}}],["仅驱动执行这一条用例",{"2":{"97":1}}],["涵盖了",{"2":{"121":1}}],["范围覆盖很少",{"2":{"121":1}}],["范围",{"2":{"121":1}}],["内外部开发者们的认可",{"2":{"129":1}}],["内容",{"2":{"121":1}}],["内置支持的条件跳过对象",{"2":{"65":1}}],["二者属于两个时代",{"2":{"121":1}}],["有些问题处理起来必然会影响到框架的兼容性",{"2":{"129":1}}],["有效性没有保障",{"2":{"121":1}}],["有效性",{"2":{"121":1}}],["有很大差异",{"2":{"121":1}}],["有何区别",{"0":{"121":1}}],["亦各从其志也",{"2":{"121":1}}],["道",{"2":{"121":1}}],["卫灵公",{"2":{"121":1}}],["论语",{"2":{"121":1}}],["孔子",{"2":{"121":1}}],["适合有离线部署需求的用户",{"2":{"130":1}}],["适配厂商可以直接使用这些单元测试进行适配测试",{"2":{"120":1}}],["适用于气泡类的断言",{"2":{"59":1}}],["专门针对元素操作方法函数进行测试",{"2":{"120":1}}],["鼓励内外部开发者贡献",{"2":{"119":1}}],["其中所有的用例步骤都应该调用方法层对应的方法",{"2":{"145":1}}],["其中有一张图片识别成功即返回结果",{"2":{"59":1}}],["其他人可以提需求",{"2":{"119":1}}],["发布",{"2":{"118":1}}],["发布一个套件版本",{"2":{"118":2}}],["阶段",{"2":{"118":1}}],["套件里面保存元素的操作方法",{"2":{"120":1}}],["套件由专人主责维护",{"2":{"119":1}}],["套件维护",{"0":{"119":1}}],["套件通过",{"2":{"118":1}}],["套件持续保持更新",{"2":{"118":1}}],["套件分大版本发布",{"2":{"118":1}}],["套件发布",{"0":{"118":1}}],["供外部用例调用",{"2":{"117":1}}],["方便用例开发者以",{"2":{"151":1}}],["方便安装",{"2":{"130":1}}],["方案说明",{"0":{"117":1,"127":1}}],["方法唯一出口类",{"2":{"142":1}}],["方法基类",{"2":{"142":1}}],["方法层按需导入框架提供的底层能力",{"2":{"144":1}}],["方法层",{"0":{"144":1}}],["方法层目录",{"2":{"142":1}}],["方法层基础代码自动生成",{"2":{"132":1}}],["方法层所有的函数",{"2":{"37":1}}],["方法代码",{"2":{"132":1}}],["方法增删改的详细数据",{"2":{"122":1}}],["方法只能有一个入参",{"2":{"66":1}}],["方法必须有返回结果并且为布尔值",{"2":{"66":1}}],["方法名必须以",{"2":{"66":1}}],["方法名称",{"0":{"8":1}}],["方法编写规范",{"2":{"66":1}}],["方法明细",{"0":{"59":1}}],["方法库里面",{"2":{"37":1}}],["方法",{"2":{"35":1}}],["方法类如何组织",{"2":{"20":1}}],["方法动词开头列表",{"2":{"8":2}}],["方法文件名称",{"0":{"6":1}}],["方法举例",{"0":{"4":1}}],["方法模块",{"2":{"3":1}}],["方法模块路径",{"0":{"3":1}}],["方法开发",{"0":{"2":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1},"2":{"20":1}}],["组装成自动化测试用例",{"2":{"114":1}}],["测试方法套件中所有的方法均为原子操作",{"2":{"117":1}}],["测试方法套件是一个独立项目",{"2":{"114":1}}],["测试单驱动插件",{"2":{"122":1}}],["测试单",{"2":{"107":1}}],["封装的",{"2":{"114":1}}],["系统中各应用在",{"2":{"127":1}}],["系统中各应用划分自己的模块",{"2":{"117":1}}],["系统所有预装应用的测试用例",{"2":{"124":1}}],["系统所有预装应用的原子操作方法",{"2":{"121":1}}],["系统级测试用例",{"2":{"124":1}}],["系统自动化测试操作方法套件",{"2":{"114":1}}],["系统显示协议跳过",{"2":{"65":1}}],["全面插件化模块化",{"2":{"130":1}}],["全面优化框架接口调用机制",{"2":{"130":1}}],["全称",{"2":{"114":1}}],["全自动日志插件",{"2":{"122":1}}],["全自动日志",{"0":{"33":1},"1":{"34":1,"35":1,"36":1,"37":1}}],["全自动输出日志",{"2":{"10":1}}],["个机器瓜分",{"2":{"112":1}}],["个测试机",{"2":{"112":1}}],["个组",{"2":{"111":1}}],["都同时执行",{"2":{"112":1}}],["都不需要再写日志代码",{"2":{"37":1}}],["条",{"2":{"112":2}}],["条用例",{"2":{"112":2}}],["条件判断组合",{"2":{"66":1}}],["条件判断跳过",{"0":{"65":1}}],["假设总共",{"2":{"112":1}}],["同事们",{"2":{"129":1}}],["同一组内瓜分执行",{"2":{"112":1}}],["同时定义一些用例工程相关的配置",{"2":{"147":1}}],["同时框架可以在中间件中对插件功能进行增强或修改",{"2":{"138":1}}],["同时对各功能进行插件化",{"2":{"130":1}}],["同时选择多个环境",{"2":{"91":1}}],["同时标记了skip",{"2":{"67":1}}],["规则概述",{"2":{"112":1}}],["一键生成用例工程模板代码",{"2":{"132":1}}],["一些底层模块或接口命名不优雅",{"2":{"129":1}}],["一对大括号表示一个组",{"2":{"111":1}}],["一个应用含有大量的操作函数",{"2":{"34":1}}],["一个函数里面至少包含一条日志信息",{"2":{"34":1}}],["一个元素一个方法",{"2":{"4":1,"144":1}}],["一个页面一个类",{"2":{"4":1,"144":1}}],["分组规则",{"0":{"111":1}}],["分割",{"2":{"72":1}}],["服务的测试报告生成插件",{"2":{"122":1}}],["服务的",{"2":{"122":1}}],["服务的图像识别插件",{"2":{"122":1}}],["服务的方式提供出来",{"2":{"71":1}}],["服务",{"2":{"109":1}}],["开发",{"2":{"121":1}}],["开启",{"2":{"109":1}}],["开头的",{"2":{"36":1}}],["开头",{"2":{"15":1,"16":1,"66":1}}],["集合写入",{"2":{"107":1}}],["将基于youqu2的用例代码修改为youqu3",{"2":{"122":1}}],["将用例",{"2":{"107":1}}],["将跳过用例操作也整合进入用例标签",{"2":{"63":1}}],["案例",{"0":{"106":1},"1":{"107":1}}],["会自动加载并执行",{"2":{"104":1,"105":1}}],["会自动生成一个命令",{"2":{"84":1,"85":1}}],["支持对用例执行的各个阶段插入钩子",{"2":{"155":1}}],["支持对各种测试策略的驱动执行",{"2":{"153":1}}],["支持对依赖环境进行一键打包",{"2":{"140":1}}],["支持用例目录或文件路径驱动执行",{"2":{"136":1}}],["支持基于关键词驱动用例执行",{"2":{"136":1}}],["支持基于测试单驱动插件驱动用例执行",{"2":{"136":1}}],["支持基于用例标签化管理驱动用例执行",{"2":{"136":1}}],["支持本地和远程执行模式",{"2":{"136":1}}],["支持多种用例驱动模式",{"2":{"132":1}}],["支持非开发者下运行",{"2":{"130":1}}],["支持离线部署",{"2":{"130":1}}],["支持在非开发着环境下运行用例",{"2":{"154":1}}],["支持在",{"2":{"103":1}}],["支持类名包含",{"2":{"36":1}}],["支持类名以",{"2":{"36":2}}],["加引号",{"2":{"102":1}}],["加上装饰器",{"2":{"37":1}}],["批量用例id驱动执行",{"0":{"101":1}}],["特有的",{"2":{"100":1}}],["特殊标签",{"2":{"62":1}}],["关键词驱动等等",{"2":{"132":1}}],["关键词驱动支持",{"2":{"99":1}}],["关键词可以是用例对象中的任意字符",{"2":{"99":1}}],["整体数据流",{"0":{"134":1}}],["整体结构",{"0":{"27":1}}],["整个字符串中可以任意截取字符作为关键词",{"2":{"99":1}}],["且有完善的单元测试机制",{"2":{"121":1}}],["且存在较多涉及用例逻辑的复杂步骤方法",{"2":{"121":1}}],["且大小写不敏感",{"2":{"99":1}}],["且要方便能使用",{"2":{"69":1}}],["根据标签执行",{"0":{"100":1}}],["根据关键词执行",{"0":{"99":1}}],["根据不同的测试类型选择以上不同的安装命令",{"2":{"91":1}}],["根据不同的架构对等待时间进行倍数放大",{"2":{"46":1}}],["指定用例目录",{"2":{"102":1}}],["指定用例文件",{"2":{"102":1}}],["指定用例文件路径执行",{"0":{"102":1}}],["指定某个目录执行",{"0":{"98":1}}],["指定执行某一个用例",{"0":{"97":1}}],["本地执行子命令为",{"2":{"94":1}}],["本地执行",{"0":{"93":1},"1":{"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1}}],["本机命令行交互",{"0":{"49":1},"1":{"50":1,"51":1,"52":1}}],["基础环境默认支持",{"2":{"91":1}}],["基础环境guiwebuihttpremote",{"2":{"91":1}}],["基于此",{"2":{"34":1}}],["基于",{"2":{"34":1,"100":1,"122":4}}],["快速开始",{"0":{"90":1},"1":{"91":1,"92":1}}],["快速创建一个自动化用例工程模板",{"2":{"20":1}}],["无限可能",{"2":{"89":1}}],["🤙️",{"2":{"89":1}}],["接口自动化测试",{"2":{"89":2}}],["接口从而控制远程机器执行用例步骤",{"2":{"71":1}}],["🔥",{"2":{"122":1}}],["🚧",{"2":{"122":3}}],["🕷️",{"2":{"89":1}}],["🚀",{"2":{"89":1}}],["🚌",{"2":{"89":1}}],["💻",{"2":{"89":1}}],["🌏",{"2":{"89":1}}],["桌面应用",{"2":{"89":1}}],["☑",{"2":{"89":6}}],["$",{"2":{"87":1}}],["删除虚拟环境",{"2":{"85":1}}],["激活虚拟环境",{"2":{"85":1}}],["命令安装使用",{"2":{"118":1}}],["命令可以将当前的虚拟环境删除",{"2":{"88":1}}],["命令",{"2":{"85":1}}],["命令行参数可以通过驱动命令提供入参选项",{"2":{"137":1}}],["命令行自动化",{"2":{"91":1}}],["命令行自动化测试",{"2":{"89":1}}],["命令行",{"2":{"72":1}}],["命令行传递参数",{"2":{"67":1}}],["命令行交互",{"0":{"48":1},"1":{"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1}}],["执行管理器接收命令行参数并读取公共配置项驱动用例执行",{"2":{"134":1}}],["执行模式支持本地驱动执行和远程驱动执行",{"2":{"132":1}}],["执行策略",{"0":{"112":1}}],["执行前确保远程机器已经开启了",{"2":{"109":1}}],["执行命令",{"2":{"107":1}}],["执行包含关键词的用例",{"2":{"99":1}}],["执行所有用例",{"0":{"96":1}}],["执行之后会自动创建一些有用的命令",{"2":{"85":1}}],["执行的时候会自动输出",{"2":{"37":1}}],["子命令",{"0":{"94":1,"109":1},"2":{"85":1}}],["还可以进行环境的管理",{"2":{"85":1}}],["虚拟环境默认在用例功能根目录下创建",{"2":{"140":1}}],["虚拟环境",{"0":{"85":1},"1":{"86":1,"87":1,"88":1}}],["你可以使用它进行用例的驱动执行和管理",{"2":{"84":1}}],["了解更多",{"2":{"79":1,"80":1,"81":1,"82":1,"83":1}}],["键鼠控制",{"0":{"79":1}}],["键鼠操作插件",{"2":{"122":1}}],["键鼠操作",{"2":{"8":1}}],["种方式传入",{"2":{"72":1}}],["机器信息有",{"2":{"72":1}}],["它不能脱离",{"2":{"121":1}}],["它除了可以驱动用例执行",{"2":{"85":1}}],["它保存了远程测试机的信息列表",{"2":{"72":1}}],["它继承了",{"2":{"58":1}}],["交互的基础能力",{"2":{"71":1}}],["远程测试机分组策略",{"0":{"110":1},"1":{"111":1,"112":1}}],["远程机器执行的用例相同",{"2":{"109":1}}],["远程执行使用子命令",{"2":{"109":1}}],["远程执行就是用本地作为服务端控制远程机器执行",{"2":{"109":1}}],["远程执行",{"0":{"108":1},"1":{"109":1,"110":1,"111":1,"112":1}}],["远程交互式控制",{"0":{"71":1},"1":{"72":1,"73":1,"74":1}}],["远程命令行交互",{"0":{"53":1},"1":{"54":1,"55":1,"56":1}}],["创建一个目录",{"2":{"70":1,"92":1}}],["创建一个工程目录",{"2":{"1":1}}],["创建用例工程",{"0":{"92":1},"2":{"70":1}}],["脚手架工具",{"0":{"70":1}}],["脚本文件id",{"2":{"61":1,"62":1,"64":1,"65":1}}],["脚本一样即可",{"2":{"41":1,"44":1}}],["此配置文件需要维护大量的标签数据",{"2":{"69":1}}],["此时会抛异常",{"2":{"138":1}}],["此时",{"2":{"62":1}}],["已废弃",{"2":{"68":1}}],["已修复",{"2":{"67":2,"68":1}}],["废弃原因",{"2":{"68":1}}],["废弃用例是特殊的标签",{"2":{"62":1}}],["废弃用例",{"0":{"68":1},"2":{"61":1,"68":2}}],["该列存在",{"2":{"68":1}}],["环境依赖管理",{"0":{"140":1}}],["环境依赖管理等相关功能的目录文件也都一键生成",{"2":{"132":1}}],["环境依赖可以一键打包交付",{"2":{"130":1}}],["环境以提供",{"2":{"71":1}}],["环境影响或评估不再适用于自动化测试时",{"2":{"68":1}}],["环境信息",{"2":{"28":1}}],["针对某些用例",{"2":{"68":1}}],["针对于某些用例修复后",{"2":{"67":1}}],["yes",{"2":{"67":2}}],["youqu2",{"0":{"121":1},"2":{"121":4,"122":1,"129":3,"130":1}}],["youqu",{"0":{"104":1,"105":1},"2":{"72":1,"100":1,"103":2,"104":2,"105":2,"107":3,"122":10,"129":1}}],["youqu3",{"0":{"86":1,"87":1,"88":1,"89":1,"122":1,"128":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1},"2":{"1":1,"4":2,"10":1,"13":1,"20":2,"24":1,"34":2,"37":2,"38":1,"46":1,"50":1,"51":1,"52":1,"54":1,"55":1,"56":1,"57":1,"58":3,"59":10,"70":1,"71":1,"74":1,"76":1,"78":1,"84":2,"85":5,"86":1,"87":5,"88":1,"91":6,"92":1,"94":2,"96":2,"97":4,"98":2,"99":2,"100":2,"101":2,"102":6,"103":1,"104":1,"105":1,"109":2,"112":2,"114":1,"121":2,"122":3,"124":1,"127":1,"129":1,"130":1,"132":1,"134":2,"136":1,"137":1,"141":1,"144":1,"146":2,"147":1}}],["you",{"2":{"41":1,"44":1}}],["中间件",{"2":{"138":1}}],["中用例增删改",{"2":{"122":1}}],["中国",{"2":{"82":1}}],["中同时填入后",{"2":{"67":1}}],["中的任意一个",{"2":{"59":1}}],["当系统中安装了",{"2":{"84":1,"85":1}}],["当",{"2":{"67":1}}],["固定填入字段为",{"2":{"67":1}}],["固定跳过",{"0":{"64":1}}],["作为父类被",{"2":{"146":1}}],["作为标记该用例是否已经修复",{"2":{"67":1}}],["作为变量输出出来了",{"2":{"37":1}}],["新增一列标签名为",{"2":{"67":1}}],["新建",{"2":{"8":1}}],["但若用例层调用了此插件提供的功能",{"2":{"138":1}}],["但",{"2":{"129":1}}],["但仍然想要跳过用例",{"2":{"67":1}}],["但不能立即删除跳过原因",{"2":{"67":1}}],["但标签化管理的核心目的是集中化管理用例的标签",{"2":{"62":1}}],["推荐统一使用",{"2":{"66":1}}],["连接符号不可使用下划线和逗号",{"2":{"66":1}}],["连接服务器重试次数",{"2":{"59":1}}],["若插件没有被安装",{"2":{"138":1}}],["若插件已经安装",{"2":{"134":1}}],["若需要多个",{"2":{"66":1}}],["若函数需要多个参数",{"2":{"66":1}}],["若是",{"2":{"65":1}}],["重要",{"2":{"66":1}}],["重试间隔时间",{"2":{"59":1}}],["截取的左侧字符串作为函数名",{"2":{"66":1}}],["截取屏幕图片的间隔时间",{"2":{"59":1}}],["截取屏幕图片的时间",{"2":{"59":1}}],["代码一致性",{"2":{"121":1}}],["代码中调用",{"0":{"23":1}}],["代表不跳过",{"2":{"66":1}}],["代表跳过",{"2":{"66":1}}],["符号将两个方法分开",{"2":{"66":1}}],["符号",{"2":{"65":1,"66":1}}],["剔除中横线和",{"2":{"65":1}}],["型号",{"2":{"65":1}}],["查看机器的",{"2":{"65":1}}],["查找图片",{"2":{"37":2}}],["说明",{"2":{"65":1,"85":1}}],["则正常调用",{"2":{"134":1}}],["则用例不会执行",{"2":{"68":1}}],["则用例不执行",{"2":{"66":1}}],["则新增一列标签名为",{"2":{"68":1}}],["则代码不会执行该条用例",{"2":{"67":1}}],["则执行该用例",{"2":{"66":1}}],["则跳过用例不执行",{"2":{"65":1}}],["则在此列备注具体的跳过原因",{"2":{"64":1}}],["或者",{"2":{"65":1}}],["或者是哪个应用的",{"2":{"8":1}}],["判断当前架构是否为",{"2":{"65":1}}],["拼接",{"2":{"65":1}}],["多个用例文件",{"2":{"102":1}}],["多个机器信息用",{"2":{"72":1}}],["多个架构之间使用",{"2":{"65":1}}],["多个参数以逗号隔开",{"2":{"36":3}}],["架构设计",{"0":{"131":1,"133":1},"1":{"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1}}],["架构设计规划",{"0":{"128":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1}}],["架构不跳过",{"2":{"65":1}}],["架构跳过",{"2":{"65":1}}],["架构名",{"2":{"65":1}}],["架构动态等待",{"0":{"46":1}}],["常见的场景为在不同架构上判断是否执行",{"2":{"65":1}}],["某些用例会因为不同的环境判断用例是否执行",{"2":{"65":1}}],["参数",{"2":{"65":2}}],["参数值可以传递任意命令行命令",{"2":{"41":1,"44":1}}],["最后所有的用例类均继承",{"2":{"146":1}}],["最大化按钮",{"2":{"83":1}}],["最大匹配次数",{"2":{"59":1}}],["最大匹配超时",{"2":{"59":1}}],["最终的用例状态会被标签为",{"2":{"64":1}}],["受到某新需求影响",{"2":{"64":1,"67":1,"68":1}}],["各模块编写思路",{"0":{"143":1},"1":{"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"153":1,"154":1,"155":1}}],["各功能以插件的方式接入",{"2":{"132":1}}],["各种代码风格不统一",{"2":{"121":1}}],["各种用例标签",{"2":{"64":1,"65":1,"67":1,"68":1}}],["各架构倍数",{"2":{"46":1}}],["示例",{"2":{"64":1,"65":1,"67":1}}],["而通过",{"2":{"63":1}}],["传统跳过用例的方式是在用例脚本里面给用例添加装饰器",{"2":{"63":1}}],["传统的日志输出方式",{"2":{"34":1}}],["跳过对象",{"2":{"65":1}}],["跳过的原因标签为",{"2":{"65":1}}],["跳过的原因统一标签开头为",{"2":{"64":1}}],["跳过用例可以直接通过修改",{"2":{"148":1}}],["跳过用例",{"0":{"63":1},"1":{"64":1,"65":1,"66":1}}],["跳过原因一栏中填写为",{"2":{"65":1}}],["跳过原因",{"2":{"61":1,"62":1,"63":1,"64":1,"65":1,"67":2,"68":1}}],["因此我们才萌生了对框架结构进行重新设计想法",{"2":{"129":1}}],["因此我们大胆的设想",{"2":{"34":1}}],["因此",{"2":{"120":1,"121":1}}],["因此你仍然可以在虚拟环境中使用命令",{"2":{"87":1}}],["因此若",{"2":{"62":1}}],["目标",{"0":{"130":1}}],["目标字符",{"2":{"59":1}}],["目录之间用空格分割",{"2":{"102":1}}],["目录组合",{"2":{"102":1}}],["目录下划分自己的用例模块",{"2":{"127":1}}],["目录下所有用例",{"2":{"98":1}}],["目录下",{"2":{"62":1}}],["所有的操作步骤都应该有一个对应的方法",{"2":{"144":1}}],["所有的方法按照",{"2":{"144":1}}],["所有的元素操作方法",{"2":{"117":1}}],["所有代码由专人维护",{"2":{"121":1}}],["所有方法以类的形式编写",{"2":{"117":1}}],["所有",{"2":{"62":1}}],["所有用例可以使用相同的类名",{"2":{"16":1}}],["建议分模块",{"2":{"62":1}}],["比如",{"2":{"65":1,"66":1,"84":1,"99":1,"118":2,"129":1,"144":2}}],["比如文件管理器",{"2":{"62":1}}],["比如气泡在1秒内消失",{"2":{"59":1}}],["对纯",{"2":{"129":1}}],["对套件的测试",{"0":{"120":1}}],["对于用例规模比较大的应用",{"2":{"62":1}}],["对象的属性值",{"2":{"137":1}}],["对象所在的位置",{"2":{"8":1}}],["对象",{"2":{"8":2}}],["后面会详细讲到",{"2":{"62":1}}],["后置命令行入参钩子",{"0":{"44":1}}],["后置脚本钩子",{"0":{"43":1}}],["后置钩子",{"0":{"42":1},"1":{"43":1,"44":1}}],["列之后的所有列都是一个用例标签",{"2":{"62":1}}],["列为",{"2":{"62":1}}],["第",{"2":{"62":1}}],["第一列写",{"2":{"19":1}}],["也可以对这个页面做进一步划分",{"2":{"144":1}}],["也可以方便对虚拟环境的管理和维护",{"2":{"140":1}}],["也可以是传统的",{"2":{"100":1}}],["也可以是自定义的数字代表用例序号",{"2":{"62":1}}],["也得到了公司领导",{"2":{"129":1}}],["也会正常执行",{"2":{"67":1}}],["也就是说我们需要写大量的日志代码",{"2":{"34":1}}],["相对位移元素定位方案的配置文件",{"2":{"142":1}}],["相对位移定位插件",{"2":{"122":1}}],["相对位移定位",{"0":{"83":1}}],["相对位置定位",{"2":{"8":1}}],["相册的用例文件为",{"2":{"62":1}}],["举例",{"2":{"62":1}}],["取中间的名称作为",{"2":{"62":1}}],["去掉用例序号后的字符串",{"2":{"62":1}}],["quot",{"2":{"62":2,"91":2,"99":2,"101":2}}],["+",{"2":{"59":2,"65":1,"137":1}}],["表示用例的id",{"2":{"62":1}}],["表示识别任意一个目标字符",{"2":{"59":1}}],["表示识别所有目标字符",{"2":{"59":1}}],["表达式",{"2":{"8":1,"99":1,"100":1}}],["`japan`",{"2":{"59":1}}],["`korean`",{"2":{"59":1}}],["`german`",{"2":{"59":1}}],["`fr`",{"2":{"59":1}}],["`en`",{"2":{"59":1}}],["`ch`",{"2":{"59":1}}],["返回",{"2":{"66":2}}],["返回识别到的所有数据",{"2":{"59":1}}],["返回图片中识别到的所有字符串",{"2":{"59":1}}],["只返回第一个",{"2":{"59":1}}],["只需要在出口文件加上类装饰器",{"2":{"37":1}}],["只需要一个类装饰器",{"2":{"10":1}}],["要识别的图片路径",{"2":{"59":1}}],["要识别的模板图片",{"2":{"59":1}}],["并提示用户安装对应插件",{"2":{"138":1}}],["并根据需要将测试结果",{"2":{"134":1}}],["并动态加载",{"2":{"134":1}}],["并在系统关键节点发布对应的版本",{"2":{"118":1}}],["并将截取的右侧作为参数传递给该函数",{"2":{"66":1}}],["并返回其在图片中的坐标",{"2":{"59":1}}],["并且所有调用的方法会以",{"2":{"37":1}}],["识别插件",{"2":{"122":1}}],["识别一个字符串或多个字符串",{"2":{"59":1}}],["识别率",{"2":{"59":1}}],["结果",{"2":{"59":2}}],["结尾的",{"2":{"36":1}}],["结尾",{"2":{"6":1,"7":1,"15":1,"16":1}}],["预期值",{"2":{"59":4}}],["不需要修改用例脚本",{"2":{"148":1}}],["不需要用户去了解和思考哪些插件适合哪种测试类型",{"2":{"139":1}}],["不再提供",{"2":{"137":1}}],["不安装插件的情况下框架也能正常运行",{"2":{"130":1}}],["不适合对外开源发布",{"2":{"121":1}}],["不涉及用例逻辑",{"2":{"121":1}}],["不受需求变更影响",{"2":{"121":1}}],["不兼容",{"2":{"121":1}}],["不相为谋",{"2":{"121":1}}],["不同",{"2":{"121":1}}],["不同组之间相同执行",{"2":{"112":1}}],["不做复杂步骤的封装",{"2":{"117":1}}],["不存在复杂步骤的堆叠封装",{"2":{"121":1}}],["不存在",{"2":{"59":2}}],["不显示",{"2":{"30":1}}],["存在跳过标签则用例也不会被执行",{"2":{"64":1}}],["存在",{"2":{"59":2}}],["应用名字",{"2":{"59":2}}],["匹配度",{"2":{"59":1}}],["匹配元素的格式",{"2":{"59":2}}],["匹配相似度",{"2":{"59":2}}],["是在",{"2":{"121":1}}],["是不同的测试方法套件版本",{"2":{"118":1}}],["是基于",{"2":{"114":1,"121":1,"124":1}}],["是专注于",{"2":{"75":1}}],["是",{"2":{"72":1,"129":1}}],["是否分模块维护取决于应用的用例复杂度",{"2":{"62":1}}],["是否递归查找",{"2":{"59":1}}],["是类装饰器",{"2":{"37":1}}],["~",{"2":{"59":2,"81":1,"83":1}}],["期望结果",{"2":{"59":2}}],["期望元素不存在",{"2":{"59":1}}],["期望元素存在",{"2":{"59":1}}],["期望不存在文件路径",{"2":{"59":1}}],["期望存在文件路径",{"2":{"59":1}}],["期望界面不存在模板图片",{"2":{"59":1}}],["期望界面存在模板图片",{"2":{"59":1}}],["屏幕上匹配不存在图片",{"2":{"59":1}}],["屏幕上匹配图片",{"2":{"59":2}}],["默认环境变量管理文件",{"0":{"149":1},"2":{"142":1}}],["默认值为",{"2":{"59":1}}],["默认为",{"2":{"59":1}}],["默认不间隔",{"2":{"59":1}}],["默认关闭",{"2":{"30":1}}],["单位秒",{"2":{"59":3}}],["单词",{"2":{"8":1}}],[">不为假",{"2":{"59":1}}],[">不为真",{"2":{"59":1}}],[">不相等",{"2":{"59":2}}],[">是否相等",{"2":{"59":2}}],[">与实际值",{"2":{"59":4}}],[">",{"2":{"59":7}}],[">=",{"2":{"59":3}}],["例",{"2":{"59":3}}],["例如",{"2":{"34":1,"59":1,"65":1}}],["图片路径",{"2":{"59":2}}],["图像识别方法所需要的资源",{"2":{"142":1}}],["图像识别",{"0":{"81":1},"2":{"8":1}}],["8",{"0":{"151":1},"2":{"59":1,"74":1,"122":1,"129":1}}],["几乎满足了所有的断言场景",{"2":{"57":1}}],["自定义执行",{"0":{"103":1},"1":{"104":1,"105":1,"106":1,"107":1}}],["自定义条件判断跳过的函数写在此文件中",{"2":{"66":1}}],["自定义跳过",{"0":{"66":1}}],["自定义断言类",{"2":{"59":1}}],["自带多种断言语句",{"2":{"57":1}}],["自动安装框架及改测试类型需要的插件依赖",{"2":{"139":1}}],["自动统计分析每次",{"2":{"122":1}}],["自动化插件",{"2":{"122":1}}],["自动化测试框架",{"2":{"130":1}}],["自动化测试框架操作方法封装写法",{"2":{"34":1}}],["自动化测试用例",{"0":{"123":1},"1":{"124":1,"125":1,"126":1,"127":1},"2":{"124":1}}],["自动化测试模块",{"2":{"122":1}}],["自动化测试方法套件",{"0":{"113":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1},"2":{"114":1}}],["自动化测试",{"2":{"89":2}}],["自动化测试的框架",{"2":{"75":1}}],["自动化",{"0":{"75":1},"1":{"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1}}],["自动输出的日志",{"2":{"37":1}}],["自动将函数说明打印为日志",{"2":{"36":3}}],["自动的将函数说明作为日志打印出来",{"2":{"34":1}}],["普通权限执行",{"0":{"50":1,"54":1}}],["元素不应该存在",{"2":{"59":1}}],["元素不存在",{"2":{"59":1}}],["元素识别动态等待",{"0":{"47":1}}],["元素定位方式",{"2":{"8":2}}],["增加了等待的日志",{"2":{"46":1}}],["优化",{"2":{"46":1}}],["html",{"2":{"122":3}}],["http",{"2":{"89":1,"91":1}}],["htop",{"2":{"41":1,"44":1,"51":1,"55":1,"56":1}}],["h",{"2":{"84":1}}],["has",{"2":{"32":1}}],["就像写",{"2":{"41":1,"44":1}}],["就可以实现自动输出日志了",{"2":{"37":1}}],["入参",{"2":{"41":1,"44":1}}],["框架预设一些文件接口规范",{"2":{"155":1}}],["框架的安装命令可以根据用例工程所属的测试类型",{"2":{"139":1}}],["框架的断言库",{"2":{"58":1}}],["框架可以正常运行",{"2":{"138":1}}],["框架底层对各功能插件提供",{"2":{"138":1}}],["框架总线接口",{"0":{"138":1}}],["框架提供驱动命令",{"2":{"136":1}}],["框架提供驱动执行的命令",{"2":{"132":1}}],["框架驱动命令传递命令行参数给执行管理器",{"2":{"134":1}}],["框架也提供初始化用例工程的功能",{"2":{"132":1}}],["框架源代码不直接呈现在用户面前",{"2":{"132":1}}],["框架代码及插件库以",{"2":{"132":1}}],["框架层提供总线服务",{"2":{"132":1}}],["框架和插件库独立维护更新",{"2":{"130":1}}],["框架而独立使用",{"2":{"121":1}}],["框架自动加载并执行对应标签的用例",{"2":{"107":1}}],["框架会在用例执行之前执行",{"2":{"41":1,"44":1}}],["框架会在用例执行之前自动加载并执行",{"2":{"40":1,"43":1}}],["框架支持通过",{"2":{"41":1,"44":1}}],["框架默认生成",{"2":{"25":1}}],["前置命令行入参钩子",{"0":{"41":1}}],["前置脚本钩子",{"0":{"40":1}}],["前置钩子",{"0":{"39":1},"1":{"40":1,"41":1}}],["前后钩子",{"0":{"38":1},"1":{"39":1,"40":1,"41":1,"42":1,"43":1,"44":1}}],["提高",{"2":{"130":1}}],["提高用例开发效率",{"2":{"130":1}}],["提高可维护性",{"2":{"20":1}}],["提供一个",{"2":{"153":1}}],["提供可调用的配置对象config",{"2":{"142":1}}],["提供丰富的键鼠控制及多种元素定位方案",{"2":{"75":1}}],["提供的一个全局对象",{"2":{"72":1}}],["提供灵活的前后钩子机制",{"2":{"38":1}}],["这些元素操作方法可以用于自动化用例调用",{"2":{"114":1}}],["这个命令可以在系统原生环境中使用",{"2":{"85":1}}],["这样在用例中能够使用统一的断言语句",{"2":{"146":1}}],["这样在日志输出的时候就能把调用函数时参数的值输出出来",{"2":{"37":1}}],["这样这条用例即使同时标记了",{"2":{"67":1}}],["这种方式需要修改用例代码",{"2":{"63":1}}],["这就是我们参考django",{"2":{"37":1}}],["用户只需要创建符合框架定义的文件命名规范脚本文件",{"2":{"155":1}}],["用户只需要关注用例",{"2":{"132":1}}],["用户可直接通过",{"2":{"118":1}}],["用于用例开发调试过程中",{"2":{"151":1}}],["用于统一存放用例步骤的操作方法",{"2":{"144":1}}],["用于统一管理命令行参数驱动用例执行",{"2":{"136":1}}],["用于虚拟环境安装",{"2":{"85":1}}],["用于属性定位相关操作",{"2":{"74":1}}],["用于保存用例标签",{"2":{"62":1}}],["用两对大括号把函数的参数括起来",{"2":{"37":1}}],["用例示例",{"2":{"142":2}}],["用例工程配置对象继承",{"2":{"147":1}}],["用例工程配置模块建议继承",{"2":{"137":1}}],["用例工程的断言方法类",{"2":{"146":1}}],["用例工程名称",{"2":{"142":1}}],["用例工程结构",{"0":{"142":1}}],["用例工程支持一键创建",{"2":{"141":1}}],["用例工程设计",{"0":{"141":1},"1":{"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1}}],["用例层负责管理用例逻辑",{"2":{"145":1}}],["用例层目录",{"2":{"142":1}}],["用例层",{"0":{"145":1},"2":{"132":1}}],["用例层直接",{"2":{"132":1}}],["用例整体打包交付之后",{"2":{"130":1}}],["用例失败录屏插件",{"2":{"122":1}}],["用例标签管理文件",{"0":{"148":1},"2":{"142":1}}],["用例标签化管理插件",{"2":{"122":1}}],["用例标题",{"2":{"18":1}}],["用例文件",{"2":{"102":1}}],["用例文件名称",{"0":{"15":1}}],["用例驱动方式",{"0":{"95":1},"1":{"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1}}],["用例执行所需要的资源",{"2":{"142":1}}],["用例执行完成后生成多种测试报告",{"2":{"134":1}}],["用例执行过程中动态调用",{"2":{"134":1}}],["用例执行驱动的命令",{"2":{"85":1}}],["用例执行时判断",{"2":{"64":1}}],["用例需要废弃",{"2":{"68":1}}],["用例id",{"2":{"67":1,"68":1}}],["用例脚本的",{"2":{"62":1}}],["用例中所需要的方法从",{"2":{"127":1}}],["用例中通过",{"2":{"58":1}}],["用例中使用方法",{"0":{"58":1}}],["用例基类",{"2":{"58":2,"142":1}}],["用例注释",{"0":{"18":1},"2":{"18":1}}],["用例函数",{"0":{"17":1}}],["用例名称",{"2":{"16":1}}],["用例举例",{"0":{"13":1}}],["用例模块",{"2":{"12":1}}],["用例模块路径",{"0":{"12":1}}],["用例开发环境下更新版本不方便",{"2":{"129":1}}],["用例开发",{"0":{"11":1},"1":{"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1},"2":{"20":1}}],["job",{"2":{"40":2,"41":3,"43":2,"44":3,"107":4}}],["jinja2",{"2":{"37":1}}],["json",{"0":{"25":1},"1":{"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1},"2":{"25":3,"27":1,"28":1,"29":1,"31":1,"32":1}}],["和上面逻辑相反",{"2":{"65":1}}],["和",{"0":{"121":1},"2":{"37":1,"67":2,"112":1,"121":2,"124":1,"129":1}}],["没错",{"2":{"37":1}}],["细心的同学可能还发现了一个小细节",{"2":{"37":1}}],["展示在",{"2":{"37":1}}],["静态方法",{"2":{"37":1}}],["包的形式提供框架能力",{"2":{"130":1}}],["包含",{"2":{"112":1}}],["包含静态方法",{"2":{"35":1}}],["包括实例方法",{"2":{"37":1}}],["之后",{"2":{"37":1,"84":1,"85":1}}],["|",{"2":{"37":2}}],["umtk",{"0":{"113":1,"121":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1},"2":{"114":1,"116":1,"117":1,"118":2,"121":4,"124":1,"127":2}}],["ut001234",{"2":{"107":4}}],["utf",{"2":{"59":1}}],["union",{"2":{"59":3}}],["uniontech",{"2":{"59":1}}],["usable",{"2":{"122":1}}],["usr",{"2":{"59":1}}],["user4",{"2":{"111":2,"112":2}}],["user3",{"2":{"111":2,"112":2}}],["user2",{"2":{"111":2,"112":2}}],["user1",{"2":{"111":2,"112":2}}],["user=",{"2":{"74":1}}],["user=user",{"2":{"74":1}}],["user",{"2":{"54":1,"55":1,"56":1,"74":1,"107":4}}],["username",{"2":{"52":1}}],["uos",{"0":{"113":1,"123":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"124":1,"125":1,"126":1,"127":1},"2":{"37":1,"74":1,"114":4,"121":1,"124":3}}],["ui操作远程对象",{"0":{"73":1},"1":{"74":1}}],["ui",{"2":{"3":1,"8":1,"12":1,"22":1,"71":2,"83":2,"89":2,"122":1,"126":1,"142":1}}],["注意",{"2":{"37":1,"91":1,"99":1,"101":1,"102":1}}],["文件来控制用例是否跳过",{"2":{"148":1}}],["文件来管理跳过用例则会方便很多",{"2":{"63":1}}],["文件里面写关键词的表达式",{"2":{"105":1}}],["文件里面写标签的表达式",{"2":{"104":1}}],["文件里面跳过原因列是否存在跳过标签",{"2":{"64":1}}],["文件管理的标签",{"2":{"100":1}}],["文件管理器",{"2":{"4":2,"74":1,"80":1,"144":2}}],["文件几乎是唯一能满足所有的要求的文件格式",{"2":{"69":1}}],["文件格式",{"0":{"69":1}}],["文件中定义用例对象的标签",{"2":{"148":1}}],["文件中自定义用例集驱动执行",{"2":{"103":1}}],["文件中所有的用例",{"2":{"97":1}}],["文件中查找是否有同名函数",{"2":{"66":1}}],["文件中",{"2":{"65":1}}],["文件中新增一列为",{"2":{"63":1}}],["文件中写入标签",{"2":{"61":1}}],["文件太多了也是一个很糟糕的事情",{"2":{"62":1}}],["文件建议放在一个",{"2":{"62":1}}],["文件",{"2":{"62":1,"104":1,"105":1,"107":2}}],["文件的文件名",{"2":{"62":1}}],["文件去掉首字符串",{"2":{"62":1}}],["文件存在",{"2":{"59":1}}],["文件名称",{"2":{"99":1}}],["文件名就应为",{"2":{"62":1}}],["文件名",{"2":{"59":1}}],["文件全路径",{"2":{"59":1}}],["文件全路径或目录",{"2":{"59":1}}],["文件不存在",{"2":{"59":1}}],["文管方法库出口",{"2":{"37":1}}],["终端输出的日志级别",{"2":{"36":1}}],["给符合条件的函数",{"2":{"35":1}}],["动态等待",{"0":{"45":1},"1":{"46":1,"47":1}}],["动态添加日志装饰器",{"2":{"35":1}}],["动态给该类下所有的函数及父类函数添加日志装饰器",{"2":{"35":1}}],["动词开头",{"2":{"8":1}}],["动词",{"2":{"8":1}}],["核心原理",{"2":{"35":1}}],["实际结果",{"2":{"59":2}}],["实例",{"2":{"37":1}}],["实例方法",{"2":{"35":1}}],["实现插件依赖的定制化",{"2":{"132":1}}],["实现步骤",{"2":{"35":1}}],["实现原理",{"0":{"35":1}}],["实践规范",{"0":{"5":1,"14":1},"1":{"6":1,"7":1,"8":1,"9":1,"10":1,"15":1,"16":1,"17":1,"18":1,"19":1}}],["的路径",{"2":{"147":1}}],["的思路",{"2":{"144":1}}],["的框架下进行开发的",{"2":{"121":1}}],["的公共方法库",{"0":{"121":1},"2":{"121":1}}],["的用例",{"2":{"67":1}}],["的脚本",{"2":{"40":1,"43":1}}],["的模板语法设计出的日志模板语法",{"2":{"37":1}}],["的坐标",{"2":{"37":2}}],["的",{"2":{"36":1,"122":1,"146":1}}],["的方式",{"2":{"35":1,"37":1}}],["的日志系统",{"2":{"34":1}}],["的想法",{"2":{"34":1}}],["天真",{"2":{"34":1}}],["那真是妙啊~",{"2":{"34":1}}],["能满足公司对自动化测试的业务需求",{"2":{"129":1}}],["能做什么",{"0":{"89":1}}],["能不能基于框架执行时",{"2":{"34":1}}],["能够直接表示元素对象即可",{"2":{"8":1}}],["从任务栏启动文件管理器",{"2":{"145":1}}],["从而驱动测试用例执行",{"2":{"136":1}}],["从而减少大量日志代码量和重复编写",{"2":{"34":1}}],["从开源至今发布了",{"2":{"129":1}}],["从pms测试单中爬取用例集",{"2":{"107":1}}],["从第",{"2":{"62":1}}],["从上面的例子也可以看出来",{"2":{"34":1}}],["从零开始构建一个完成的自动化用例工程",{"2":{"20":1}}],["从零开始构建自动化工程",{"0":{"20":1}}],["具有较高的重复度",{"2":{"34":1}}],["函数名等等都可以做为关键词",{"2":{"99":1}}],["函数名",{"2":{"65":1}}],["函数功能说明中",{"2":{"37":1}}],["函数说明以及函数操作日志",{"2":{"34":1}}],["函数注释",{"0":{"9":1},"2":{"9":1}}],["我们可以将界面分为四个区域",{"2":{"144":1}}],["我们想要设计开发一个更加简单易用",{"2":{"129":1}}],["我们需要建立对套件的自动化测试",{"2":{"120":1}}],["我们设计出了",{"2":{"34":1}}],["我们发现",{"2":{"34":1}}],["我们将指导如何基于",{"2":{"20":1}}],["通过配置的接口进行数据回填",{"2":{"134":1}}],["通过命令行参数控制",{"2":{"132":1}}],["通过获取该函数返回的布尔值",{"2":{"66":1}}],["通过ocr识别到不应存在的文案",{"2":{"59":2}}],["通过ocr未识别到",{"2":{"59":3}}],["通过观察前面的例子",{"2":{"37":1}}],["通过",{"2":{"35":2}}],["通过日志输出器将其输出即可",{"2":{"35":1}}],["通过给类加上一个装饰器",{"2":{"35":1}}],["通过经验观察",{"2":{"34":1}}],["通常是这样的",{"2":{"34":1}}],["可实现群控测试机执行",{"2":{"130":1}}],["可视化配置",{"0":{"153":1},"2":{"130":1}}],["可视化驱动",{"2":{"122":1}}],["可定制化依赖",{"2":{"130":1}}],["可自定义多个参数之间的连接符",{"2":{"66":1}}],["可能包含多条日志信息",{"2":{"34":1}}],["可以通过系统环境变量或修改",{"2":{"137":1}}],["可以根据测试项目类型安装对应的依赖",{"2":{"130":1}}],["可以根据需要在里面添加配置",{"2":{"22":1}}],["可以在通过命令行快速驱动测试用例执行",{"2":{"132":1}}],["可以在无网络环境下直接运行",{"2":{"130":1}}],["可以在方法层",{"2":{"127":1}}],["可以对外开源发布",{"2":{"121":1}}],["可以调用",{"2":{"117":1}}],["可以自动安装对应的依赖集",{"2":{"91":1}}],["可以自动加载虚拟环境并驱动用例工程",{"2":{"86":1}}],["可以激活虚拟环境",{"2":{"87":1}}],["可以随意新增",{"2":{"62":1}}],["可以完全代替之前这样的写法",{"2":{"46":1}}],["可以用页面的名称",{"2":{"6":1,"7":1}}],["省略代码部分",{"2":{"34":1}}],["点击某个元素",{"2":{"34":2,"37":1}}],["点击右键菜单中的",{"2":{"13":1}}],["需要在每个函数里面主动编写日志输出代码",{"2":{"34":1}}],["类似于单元测试",{"2":{"120":1}}],["类名",{"2":{"99":1}}],["类名称",{"0":{"7":1,"16":1}}],["类",{"2":{"35":1}}],["类方法",{"2":{"35":1,"37":1}}],["类里面一个函数只包含一个操作或多次调用的一系列可合并的操作",{"2":{"34":1}}],["背景",{"0":{"34":1,"129":1}}],["警告信息",{"2":{"32":1}}],["k",{"2":{"97":4,"98":2,"99":2}}],["klvvw5821",{"2":{"65":1}}],["klvv",{"2":{"65":1}}],["keywords",{"0":{"105":1},"2":{"31":1,"103":1,"105":2}}],["kill",{"2":{"13":1}}],["收集器节点的列表",{"2":{"30":1}}],["汇总信息",{"2":{"29":1}}],["55",{"2":{"74":1}}],["50",{"2":{"31":1,"112":1}}],["5",{"0":{"120":1,"140":1,"148":1,"152":1},"1":{"153":1,"154":1,"155":1},"2":{"28":2,"46":3,"122":1,"129":1}}],["56",{"2":{"28":1}}],["wdotool",{"2":{"122":1}}],["w5821",{"2":{"65":1}}],["widget",{"2":{"59":18,"74":1}}],["with",{"2":{"28":1}}],["web",{"2":{"89":1,"122":2,"153":1}}],["webassert",{"2":{"58":2}}],["webui",{"2":{"58":1,"91":2}}],["wayland",{"2":{"65":1,"66":1,"122":1}}],["want",{"2":{"41":1,"44":1}}],["warnings",{"0":{"32":1},"2":{"27":2}}],["what",{"2":{"41":1,"44":1}}],["9",{"2":{"28":1,"37":2,"122":1}}],["7",{"0":{"150":1},"2":{"74":1,"122":1}}],["78",{"2":{"28":1}}],["7981803",{"2":{"27":1}}],["l1",{"2":{"100":3}}],["lang",{"2":{"59":1}}],["lang=lang",{"2":{"59":2}}],["lang=",{"2":{"59":2}}],["lambda",{"2":{"37":1,"59":2}}],["leftmethod",{"2":{"144":1}}],["len",{"2":{"59":4}}],["level",{"2":{"36":1}}],["list",{"2":{"59":1}}],["license",{"2":{"59":1,"116":1,"126":1}}],["lineno",{"2":{"31":1}}],["linuxdeepin",{"2":{"129":1}}],["linux",{"2":{"28":1,"75":1,"89":3,"91":1,"122":1,"130":1}}],["ltd",{"2":{"59":1}}],["l",{"2":{"52":1,"54":1}}],["ls",{"2":{"50":1,"52":1,"54":1}}],["loogarch64",{"2":{"65":2}}],["loongarch64",{"2":{"46":1}}],["lower",{"2":{"59":1}}],["logger",{"2":{"34":1,"37":1,"59":12}}],["log",{"2":{"4":4,"10":4,"35":1,"36":1,"37":5,"59":2}}],["40",{"2":{"59":6}}],["47",{"2":{"37":1}}],["48",{"2":{"37":1}}],["4",{"0":{"119":1,"135":1,"136":1,"137":1,"138":1,"139":2,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":2,"148":1,"149":1,"150":1,"151":1},"1":{"136":1,"137":1,"138":1,"139":1,"140":1,"142":1,"143":1,"144":2,"145":2,"146":2,"147":2,"148":2,"149":2,"150":2,"151":2,"153":1,"154":1,"155":1},"2":{"28":3,"122":1}}],["679537",{"2":{"64":1,"67":1,"68":1}}],["64",{"2":{"28":1,"37":1,"46":2,"65":2}}],["6",{"0":{"121":1,"149":1},"2":{"28":2,"37":1,"59":2,"122":1}}],["3",{"0":{"66":1,"118":1,"131":1,"132":1,"133":1,"134":2,"135":1,"136":1,"137":1,"138":2,"139":1,"140":1,"146":1},"1":{"132":1,"133":1,"134":1,"135":1,"136":2,"137":2,"138":2,"139":2,"140":2},"2":{"28":2,"29":1,"122":1}}],["02",{"2":{"37":1}}],["0",{"2":{"27":1,"28":4,"37":1,"59":1,"129":2}}],["002",{"2":{"3":1,"12":1,"22":1,"98":1,"102":2,"142":1}}],["001",{"2":{"3":1,"12":1,"13":1,"22":1,"37":2,"58":2,"61":1,"62":2,"65":1,"97":7,"98":1,"99":5,"102":4,"126":2,"142":1,"145":2,"146":2}}],["18",{"2":{"122":1}}],["16",{"2":{"122":1}}],["168",{"2":{"72":3}}],["15",{"2":{"122":1}}],["1518371686",{"2":{"27":1}}],["14",{"2":{"122":1}}],["13",{"2":{"122":1}}],["12",{"2":{"122":1}}],["123456",{"2":{"107":4}}],["1235666275024414",{"2":{"27":1}}],["11",{"2":{"122":1}}],["1159151",{"2":{"13":1}}],["192",{"2":{"72":3}}],["17",{"2":{"37":1,"122":1}}],["1071",{"2":{"118":1}}],["1070",{"2":{"118":1}}],["100",{"2":{"112":3}}],["10",{"2":{"29":2,"74":1,"122":1}}],["1",{"0":{"64":1,"114":1,"116":1,"124":1,"126":1,"129":1,"132":1,"136":1,"142":1,"144":1},"2":{"27":1,"28":4,"29":3,"46":3,"59":7,"62":1,"72":5,"74":1,"97":3,"122":1,"129":1,"142":1}}],["在浏览器中输入一些配置后即可驱动测试用例执行",{"2":{"130":1}}],["在继承",{"2":{"130":1}}],["在现有框架下",{"2":{"129":1}}],["在公司的多个自动化流程中运行得很好",{"2":{"129":1}}],["在公司内部已经被大量的自动化测试项目使用",{"2":{"129":1}}],["在操作方法多了之后",{"2":{"120":1}}],["在同一个大版本中",{"2":{"118":1}}],["在不同的代码仓库中",{"2":{"118":1}}],["在根目录下定义",{"2":{"104":1,"105":1}}],["在服务端通过调用",{"2":{"71":1}}],["在远程测试机上部署一个完整的",{"2":{"71":1}}],["在用例执行过程中控制远程机器执行复杂的",{"2":{"71":1}}],["在用例收集阶段会以第一个",{"2":{"66":1}}],["在用例工程根目录下存放",{"2":{"66":1}}],["在用例工程目录下存放一个",{"2":{"40":1,"43":1}}],["在用例工程目录下生成报告文件",{"2":{"25":1}}],["在子项目目录下新建",{"2":{"62":1}}],["在",{"2":{"61":1,"63":1,"65":1,"66":1,"148":1}}],["在一段时间内截图多张图片进行识别",{"2":{"59":1}}],["在报告中更能一目了然的看到用例执行步骤",{"2":{"37":1}}],["在屏幕中相似度大于",{"2":{"37":2}}],["在应用库",{"2":{"37":1}}],["在此装饰器中我们能动态的捕获所调用函数的功能说明",{"2":{"35":1}}],["在任务栏右键点击文件管理器",{"2":{"4":1}}],["在任务栏点击文件管理器",{"2":{"4":1}}],["报告中",{"2":{"37":1}}],["报告内容",{"0":{"26":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1,"32":1}}],["报告",{"0":{"25":1},"1":{"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1},"2":{"25":1}}],["xdg",{"2":{"65":1,"66":1}}],["xdist",{"2":{"28":1}}],["x",{"2":{"37":2,"59":4}}],["xxx",{"2":{"34":1,"36":3,"37":1,"58":1,"61":3,"64":1,"67":2,"97":7}}],["xxxx",{"2":{"25":1,"107":4}}],["xpassed",{"2":{"29":1}}],["xfailed",{"2":{"29":1}}],["x86",{"2":{"28":1,"37":1,"65":2}}],["x11",{"2":{"24":1,"65":1}}],["x3c",{"2":{"3":1,"12":1,"18":1,"22":1,"59":17}}],["工程结构",{"0":{"116":1,"126":1}}],["工程设计",{"0":{"115":1,"125":1},"1":{"116":1,"117":1,"126":1,"127":1}}],["工程遵循完整的",{"2":{"70":1}}],["工程自有断言模块",{"2":{"58":1}}],["工程配置",{"2":{"22":1}}],["工程创建",{"0":{"1":1},"2":{"20":1}}],["介绍自动化用例工程配置模块如何管理配置",{"2":{"20":1}}],["如",{"2":{"104":1,"105":1,"132":1,"147":1}}],["如果一个页面元素操作比较多",{"2":{"144":1}}],["如果一个应用存在多个页面",{"2":{"144":1}}],["如果涉及到复杂步骤的封装",{"2":{"127":1}}],["如果你想执行这个",{"2":{"97":1}}],["如果应用受到新需求影响需要跳过",{"2":{"64":1}}],["如果应用涉及的页面较多需要做划分",{"2":{"6":1,"7":1}}],["如果不传默认截取全屏识别",{"2":{"59":1}}],["如果不传参",{"2":{"59":1}}],["如果用常规的图像识别则有可能无法识别到",{"2":{"59":1}}],["如果比较复杂操作步骤",{"2":{"34":1}}],["如何管理自动化用例工程的依赖项",{"2":{"20":1}}],["如何编写",{"2":{"20":1}}],["设计思想",{"2":{"144":1}}],["设计理念进行方法封装",{"2":{"20":1}}],["设计模式",{"2":{"4":1,"70":1,"117":1,"132":1}}],["官方提供的脚手架工具",{"2":{"20":1}}],["使用更简单方便",{"2":{"130":1}}],["使用的框架不同",{"2":{"121":1}}],["使用框架的后置钩子触发结果回填到",{"2":{"107":1}}],["使用框架的前置钩子触发爬取动作生成",{"2":{"107":1}}],["使用逻辑表达式的时候一定要加引号",{"2":{"99":1,"101":1}}],["使用脚手架功能创建用例工程",{"2":{"92":1}}],["使用脚手架工具创建用例工程",{"2":{"1":1,"70":1}}],["使用子命令",{"2":{"70":1}}],["使用说明",{"0":{"61":1,"77":1},"1":{"78":1,"79":1,"80":1,"81":1,"82":1,"83":1}}],["使用方法很简单",{"2":{"37":1}}],["使用方法",{"0":{"37":1}}],["使用",{"2":{"20":2,"65":1,"66":1,"118":1,"132":1}}],["继承了",{"2":{"146":1}}],["继承",{"2":{"16":1,"58":1,"146":1}}],["断言方法类",{"2":{"142":1}}],["断言资源",{"2":{"142":1}}],["断言文案不存在",{"2":{"59":1}}],["断言文案存在",{"2":{"59":1}}],["断言文件不存在",{"2":{"59":1}}],["断言文件存在",{"2":{"59":1}}],["断言结果为假",{"2":{"59":1}}],["断言结果为真",{"2":{"59":1}}],["断言不相等",{"2":{"59":1}}],["断言相等",{"2":{"59":1}}],["断言应用进程不存在",{"2":{"59":1}}],["断言应用进程状态",{"2":{"59":4}}],["断言应用进程存在",{"2":{"59":1}}],["断言元素不存在",{"2":{"59":1}}],["断言元素存在",{"2":{"59":1}}],["断言语句",{"0":{"57":1},"1":{"58":1,"59":1}}],["断言",{"0":{"146":1},"2":{"13":1}}],["2024",{"2":{"129":1}}],["2021",{"2":{"129":1}}],["2023",{"2":{"59":1,"129":1}}],["28",{"2":{"37":1}}],["22",{"2":{"28":1}}],["2",{"0":{"65":1,"115":1,"116":1,"117":2,"125":1,"126":1,"127":2,"130":1,"133":1,"137":1,"143":1,"144":1,"145":2,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1},"1":{"116":1,"117":1,"126":1,"127":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"153":1,"154":1,"155":1},"2":{"13":1,"28":1,"29":2,"46":3,"59":1,"62":1,"72":2,"97":1,"111":1,"112":2,"122":1,"129":2,"142":1}}],["打开进行编辑查看",{"2":{"69":1}}],["打开",{"2":{"13":1}}],["video",{"2":{"122":1}}],["virtualenv",{"2":{"87":1}}],["v25",{"2":{"118":1}}],["v20",{"2":{"118":2}}],["values",{"2":{"59":3}}],["v",{"2":{"12":1}}],["or",{"2":{"59":1,"99":1,"100":3,"101":9,"104":2,"105":2}}],["os",{"2":{"59":5}}],["outcome",{"2":{"31":1}}],["open",{"2":{"13":1}}],["ocr",{"2":{"8":1,"59":4,"82":1,"122":1}}],["ocr识别",{"0":{"82":1},"2":{"8":1}}],["only",{"2":{"59":1}}],["on",{"2":{"4":2,"13":1,"144":1,"145":1}}],["属性定位插件",{"2":{"122":1}}],["属性定位",{"0":{"80":1},"2":{"8":1}}],["num",{"2":{"122":1}}],["number=max",{"2":{"59":2}}],["number=match",{"2":{"59":2}}],["number",{"2":{"59":9}}],["network",{"2":{"59":9}}],["new",{"2":{"8":1}}],["not",{"2":{"59":13,"65":2,"99":1,"100":1}}],["none",{"2":{"59":26}}],["nodeid",{"2":{"31":1,"32":1}}],["n",{"2":{"52":1}}],["name=",{"2":{"83":1}}],["name",{"2":{"4":1,"10":1,"15":1,"17":1,"18":1,"19":2,"36":3,"65":3,"74":1,"122":1}}],["拖动到",{"2":{"8":1}}],["拖动",{"2":{"8":1}}],["移动",{"2":{"8":1}}],["双击",{"2":{"8":1}}],["名称",{"2":{"8":2}}],["位置",{"2":{"8":2}}],["遵循",{"2":{"4":1,"117":1}}],["\\t\\tself",{"2":{"146":1}}],["\\tdef",{"2":{"144":1}}],["\\t",{"2":{"4":1,"144":1}}],["pdocr",{"2":{"122":1}}],["public",{"0":{"121":1},"2":{"121":4}}],["pr",{"2":{"119":2}}],["project",{"2":{"74":2}}],["product",{"2":{"65":1}}],["process",{"2":{"13":2,"59":4,"145":1}}],["pms",{"2":{"107":14,"122":2}}],["pms用例驱动",{"0":{"107":1}}],["pip",{"2":{"91":1,"118":1}}],["picture",{"2":{"59":13}}],["pic",{"2":{"37":1,"59":14}}],["png",{"2":{"37":2,"59":4,"81":1}}],["playwright",{"2":{"122":2}}],["platform",{"2":{"28":1,"65":5,"66":1}}],["plugins",{"2":{"28":1}}],["pluggy",{"2":{"28":1}}],["pause=pause",{"2":{"59":4}}],["pause",{"2":{"59":8}}],["pass",{"2":{"59":4}}],["password=",{"2":{"74":1}}],["password=password",{"2":{"74":1}}],["password2",{"2":{"72":1}}],["password1",{"2":{"72":2}}],["password",{"2":{"52":1,"54":1,"55":1,"56":1,"74":1,"107":4}}],["passed",{"2":{"29":1}}],["param",{"2":{"37":2,"59":32}}],["parent",{"2":{"22":1}}],["packages",{"2":{"28":1}}],["path=",{"2":{"83":1}}],["pathlib",{"2":{"22":2}}],["path",{"2":{"4":2,"22":1,"27":1,"32":2,"37":1,"59":17,"74":1,"80":1}}],["popmethod",{"2":{"144":1}}],["po",{"2":{"4":1,"20":1,"70":1,"117":1,"132":1,"144":1}}],["pydbussend",{"2":{"122":1}}],["pypi",{"2":{"118":1}}],["pylinuxauto",{"2":{"4":3,"59":14,"75":1,"78":1,"79":1,"122":1,"127":1}}],["pythonpylinuxauto",{"2":{"79":1,"80":1,"81":1,"82":1,"83":1}}],["python3",{"2":{"41":1,"44":1,"59":1}}],["pythondfmwidget",{"2":{"37":1}}],["pythondef",{"2":{"8":1,"9":1,"17":1,"18":1}}],["pythonclass",{"2":{"34":1,"58":1}}],["python",{"2":{"28":1,"37":2,"58":2,"59":1,"74":1,"97":1,"130":1,"132":1,"144":1,"145":1,"146":3}}],["pythonimport",{"2":{"22":1}}],["pythonfrom",{"2":{"4":1,"10":1,"13":2,"23":1,"24":1,"36":1,"46":2,"50":1,"51":1,"52":1,"54":1,"55":1,"56":1,"78":1,"117":1,"118":1,"127":1}}],["pytest",{"2":{"3":1,"12":1,"22":1,"28":1,"63":1,"100":2,"122":3,"126":1}}],["py",{"2":{"3":8,"4":1,"12":8,"13":2,"15":1,"22":9,"28":1,"31":2,"32":2,"37":2,"40":2,"41":1,"43":2,"44":1,"58":3,"62":2,"66":2,"67":1,"74":1,"97":2,"98":4,"99":2,"102":6,"116":6,"126":12,"142":11,"144":1,"145":1,"146":4}}],["equal",{"2":{"59":2}}],["ele",{"2":{"144":1}}],["elementnotfound",{"2":{"59":1}}],["elements",{"2":{"37":5}}],["element",{"2":{"4":2,"37":2,"59":8,"74":1,"80":1,"81":1,"82":1,"83":1}}],["elif",{"2":{"59":4}}],["else",{"2":{"59":8}}],["events=",{"2":{"52":1}}],["expr",{"2":{"59":10}}],["expanduser",{"2":{"59":2}}],["expect",{"2":{"52":1,"56":1,"59":18}}],["expect交互",{"0":{"52":1,"56":1}}],["excel",{"2":{"69":1}}],["except",{"2":{"59":5}}],["exceptions",{"2":{"59":10}}],["exc",{"2":{"59":6}}],["exitcode",{"2":{"27":1}}],["exists",{"2":{"59":2}}],["exist",{"2":{"13":1,"59":11}}],["error",{"2":{"29":1,"36":1}}],["envx",{"2":{"85":2}}],["env",{"2":{"59":1,"126":1,"142":1}}],["environment",{"0":{"28":1},"2":{"27":2}}],["end",{"2":{"43":1,"44":3,"107":2}}],["endswith",{"2":{"4":1,"10":1,"36":1}}],["button",{"2":{"122":1}}],["bus",{"2":{"122":1}}],["bool",{"2":{"59":4}}],["bin",{"2":{"59":1}}],["because",{"2":{"32":1}}],["bar",{"2":{"28":1,"31":1}}],["basemethod",{"2":{"144":2}}],["basecase",{"2":{"13":3,"16":1,"58":3,"145":2,"146":5}}],["base",{"2":{"3":2,"12":2,"13":2,"22":2,"58":1,"98":1,"126":2,"142":2,"144":1,"145":1,"146":2}}],["bash$",{"2":{"87":1,"94":2,"96":2,"97":4,"98":2,"99":2,"100":2,"101":2,"102":6,"109":3,"112":2}}],["bashpip",{"2":{"76":1,"91":5}}],["bashpython3",{"2":{"67":1}}],["bash",{"2":{"72":1}}],["bashyouqu3",{"2":{"41":2,"44":2,"72":1,"84":2,"85":1,"86":1,"107":2}}],["bashmy",{"2":{"40":1,"43":1}}],["bashmkdir",{"2":{"1":1,"70":1,"92":1}}],["bash>>",{"2":{"37":1}}],["bashtest",{"2":{"15":1}}],["bashcd",{"2":{"1":1,"70":1,"92":1}}],["btn",{"2":{"4":2,"74":1,"80":1,"83":1,"144":1}}],["by",{"2":{"4":4,"8":5,"13":2,"34":1,"37":1,"59":6,"74":3,"80":1,"81":1,"82":1,"83":1}}],["==",{"2":{"59":5,"74":1}}],["=",{"2":{"4":1,"10":1,"22":5,"36":4,"37":1,"46":5,"59":36,"74":2}}],["group2",{"2":{"111":1,"112":1}}],["group1",{"2":{"111":1,"112":2}}],["group",{"2":{"111":1}}],["get",{"2":{"59":3}}],["getmembers",{"2":{"35":1}}],["gpl",{"2":{"59":1}}],["git",{"2":{"41":1,"44":1,"122":1,"132":1}}],["gitignore",{"2":{"3":1,"12":1,"22":1}}],["gui",{"0":{"75":1},"1":{"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1},"2":{"4":1,"59":7,"74":3,"75":1,"76":1,"78":1,"91":2,"122":1,"127":1}}],["false",{"2":{"59":11,"66":2}}],["fail",{"2":{"31":2}}],["failed",{"2":{"29":1,"31":1}}],["float",{"2":{"59":13}}],["f",{"2":{"37":1,"59":34,"102":6}}],["foo0",{"2":{"31":1}}],["foo",{"2":{"28":1,"31":3,"32":2}}],["funnylog",{"2":{"36":1}}],["funnylog2",{"2":{"4":1,"10":1,"122":1}}],["func",{"2":{"9":1,"35":1}}],["fixed",{"2":{"61":1,"67":3,"68":1}}],["fixture",{"2":{"20":1,"142":1}}],["filter",{"2":{"59":2}}],["filecopyrighttext",{"2":{"59":1}}],["file",{"0":{"13":1},"2":{"4":2,"13":3,"22":1,"59":14,"74":2,"83":1,"116":2,"117":2,"118":1,"126":2,"127":1,"144":1,"145":2}}],["first=return",{"2":{"59":2}}],["first=false",{"2":{"59":2}}],["first",{"2":{"59":3}}],["find",{"2":{"4":2,"37":4,"59":6,"80":1,"81":1,"82":1,"83":1}}],["from",{"2":{"4":2,"10":1,"13":2,"37":2,"58":3,"59":14,"74":2,"127":1,"144":2,"145":2,"146":3}}],["d",{"2":{"122":1}}],["driver",{"2":{"107":5,"122":1,"136":2}}],["dragon",{"2":{"122":1}}],["drag",{"2":{"8":2}}],["dbus",{"2":{"89":1}}],["dmidecode",{"2":{"65":1}}],["dict",{"2":{"59":4}}],["during",{"2":{"59":2}}],["duration",{"2":{"27":1}}],["desc",{"2":{"122":1}}],["desktop",{"2":{"59":2,"81":1,"83":1}}],["deepin",{"2":{"116":4}}],["debug",{"2":{"36":1,"142":1,"151":1}}],["def",{"2":{"4":2,"13":2,"34":1,"37":2,"58":1,"59":15,"74":2,"97":2,"145":1,"146":1}}],["dfm",{"2":{"13":2,"37":2,"126":2}}],["dogtail",{"2":{"74":1,"122":1,"144":3}}],["do",{"2":{"41":2,"44":2}}],["doc",{"2":{"35":1}}],["dock",{"0":{"4":1},"2":{"4":5,"13":2,"74":1,"80":1,"126":4,"144":1,"145":1}}],["double",{"2":{"8":1,"79":1}}],["ddefilemanagermethod",{"2":{"117":2,"118":1,"127":1}}],["ddedockmethod",{"2":{"4":1,"10":1,"13":4}}],["dde",{"0":{"4":1,"13":1},"2":{"4":5,"13":4,"59":1,"74":3,"80":1,"83":1,"116":2,"117":2,"118":1,"126":4,"127":1,"144":1,"145":2}}],["以便方法或用例中能够获取到",{"2":{"147":1}}],["以此控制虚拟环境创建",{"2":{"149":1}}],["以此来获取框架已有的公共配置",{"2":{"147":1}}],["以此类推",{"2":{"118":1}}],["以插件的形式提供功能",{"2":{"130":1}}],["以下简称测试用例",{"2":{"124":1}}],["以下简称测试方法套件",{"2":{"114":1}}],["以保持套件的各方面一致性",{"2":{"119":1}}],["以上写法表示有",{"2":{"111":1}}],["以应用名称开头",{"2":{"6":1,"7":1}}],["以",{"0":{"4":1,"13":1},"2":{"6":1,"7":1,"16":2,"62":1,"130":1}}],["rm",{"0":{"88":1},"2":{"85":1,"88":1}}],["rpcgui",{"0":{"74":1},"2":{"74":2}}],["rpc",{"2":{"71":2,"74":1,"122":6}}],["raise",{"2":{"59":19}}],["rate=rate",{"2":{"59":2}}],["rate=0",{"2":{"37":1}}],["rate",{"2":{"37":1,"59":7}}],["run",{"2":{"41":2,"44":2,"50":1,"51":1,"52":1,"54":1,"55":1,"56":1,"67":1,"72":1,"84":1,"86":1,"87":1,"94":3,"96":2,"97":4,"98":2,"99":2,"100":2,"101":2,"102":6,"107":2}}],["ruff",{"2":{"3":1,"12":1,"22":1}}],["root",{"2":{"27":1,"72":3}}],["rootdir",{"2":{"22":4,"23":1,"74":1}}],["rightmethod",{"2":{"144":1}}],["right",{"2":{"4":2,"8":1,"13":2}}],["record",{"2":{"122":1}}],["recursive",{"2":{"59":1}}],["removed",{"2":{"61":1,"68":2}}],["remotemethod",{"2":{"74":2}}],["remote",{"2":{"54":1,"55":1,"56":1,"74":1,"91":1,"109":3,"112":2}}],["remotecmd",{"2":{"54":2,"55":2,"56":2}}],["retry=network",{"2":{"59":4}}],["retry",{"2":{"59":9}}],["return",{"2":{"37":2,"59":6}}],["report",{"2":{"25":2,"122":1}}],["requirements",{"2":{"3":1,"12":1,"22":1,"126":1,"142":1}}],["readme",{"2":{"3":4,"12":4,"22":4,"116":1,"126":1}}],["restart",{"2":{"74":2,"109":1}}],["restart=false",{"2":{"74":1}}],["res",{"2":{"3":3,"12":3,"22":9,"37":1,"59":21,"142":3,"147":3}}],["titlemethod",{"2":{"144":1}}],["timeout=timeout",{"2":{"59":4}}],["timeout",{"2":{"59":5}}],["time",{"2":{"46":1,"59":4}}],["task",{"2":{"107":4}}],["tags",{"0":{"104":1},"2":{"62":1,"103":1,"104":2,"107":2}}],["t",{"2":{"100":2,"101":2}}],["type",{"2":{"65":1,"66":1}}],["typing",{"2":{"59":1}}],["transfer",{"2":{"122":1}}],["trace",{"2":{"35":2}}],["true",{"2":{"59":4,"66":2,"145":1}}],["try",{"2":{"59":4}}],["tuple",{"2":{"37":1,"59":2}}],["templateelementfound",{"2":{"59":3}}],["templateelementnotfound",{"2":{"59":5}}],["technology",{"2":{"59":1}}],["teardown",{"2":{"13":2,"31":1}}],["testmusic",{"2":{"99":1}}],["testmycase",{"2":{"58":1,"145":1}}],["testcase",{"2":{"97":1,"146":1}}],["testfoo",{"2":{"32":2}}],["tests",{"0":{"31":1},"2":{"27":3,"32":1,"116":1}}],["testdfm",{"2":{"13":1}}],["test",{"2":{"3":2,"12":2,"13":2,"15":1,"16":1,"17":1,"18":1,"22":2,"31":8,"32":3,"58":1,"62":2,"81":1,"97":7,"98":2,"99":2,"102":6,"126":2,"142":2,"145":2,"146":2}}],["toolkit",{"2":{"114":1,"116":1}}],["todo",{"2":{"56":1}}],["total",{"2":{"29":1}}],["to",{"2":{"8":2,"27":1,"32":1}}],["toml",{"2":{"3":1,"12":1,"22":1}}],["txtid1",{"2":{"104":1,"105":1}}],["txt",{"0":{"104":1,"105":1},"2":{"3":1,"12":1,"22":1,"59":3,"103":3,"104":2,"105":2,"107":2,"111":1,"126":1,"142":1}}],["cd",{"2":{"130":1}}],["ci",{"2":{"130":1}}],["center",{"2":{"122":1}}],["c",{"2":{"112":2}}],["cpu",{"2":{"65":3}}],["ch",{"2":{"59":2}}],["cmd",{"2":{"50":3,"51":3,"52":3,"54":1,"55":1,"56":1,"59":4}}],["c1",{"2":{"32":1}}],["cargo",{"0":{"86":1},"2":{"85":1,"86":2,"94":1,"96":1,"97":2,"98":1,"99":1,"100":1,"101":1,"102":3,"107":1,"109":1,"112":1}}],["cache",{"2":{"59":5}}],["cannot",{"2":{"32":1}}],["call",{"2":{"31":1}}],["case",{"2":{"3":2,"12":2,"13":4,"15":3,"17":2,"18":2,"19":3,"22":3,"40":2,"43":2,"58":2,"98":2,"99":1,"102":8,"126":3,"127":1,"142":4,"144":1,"145":3,"146":3}}],["commit",{"2":{"122":2}}],["count",{"2":{"59":1}}],["co",{"2":{"59":1}}],["coding",{"2":{"59":1}}],["code",{"2":{"32":1}}],["contain",{"2":{"36":1}}],["constructor",{"2":{"32":1}}],["conf",{"2":{"36":1}}],["conftest",{"2":{"3":1,"12":1,"22":1,"142":1}}],["config",{"2":{"3":1,"4":4,"10":4,"12":1,"22":5,"23":3,"37":1,"74":2,"83":1,"126":1,"142":1}}],["collect",{"2":{"32":1}}],["collected",{"2":{"29":1}}],["collectors",{"0":{"30":1},"2":{"27":2}}],["created",{"2":{"27":1}}],["cli",{"2":{"129":1}}],["click",{"2":{"4":4,"8":3,"13":2,"34":1,"37":1,"74":3,"79":2,"80":1,"81":1,"82":1,"83":1,"144":2,"145":1}}],["clone",{"2":{"41":1,"44":1}}],["cls",{"2":{"37":2,"59":1}}],["classmethod",{"2":{"37":1,"59":1}}],["class",{"2":{"4":2,"10":2,"13":2,"22":1,"32":1,"36":3,"37":2,"58":2,"59":1,"74":1,"97":1,"144":1,"145":1,"146":3}}],["csv文件与脚本对应关系",{"0":{"62":1}}],["csv文件名称对应用例文件名称的",{"2":{"19":1}}],["csv文件",{"0":{"19":1},"2":{"62":1}}],["csv",{"2":{"3":1,"12":1,"19":1,"22":1,"61":1,"62":6,"63":2,"64":1,"65":1,"69":1,"100":1,"126":2,"142":1,"148":2}}],["smoke",{"2":{"98":4,"100":2}}],["slaves",{"2":{"72":3}}],["slaves对象提供远程机器信息",{"0":{"72":1}}],["sleep",{"2":{"13":2,"46":3}}],["systemctl",{"2":{"109":1}}],["system",{"2":{"65":1}}],["s",{"2":{"65":1}}],["skipif",{"2":{"65":8,"66":6}}],["skiped",{"2":{"64":1}}],["skip",{"2":{"61":1,"63":1,"64":2,"67":3,"68":1}}],["skipped",{"2":{"29":1}}],["similarity=similarity",{"2":{"59":2}}],["similarity=0",{"2":{"59":2}}],["similarity",{"2":{"59":1}}],["screen",{"2":{"59":8}}],["software",{"2":{"59":1}}],["spdx",{"2":{"59":2}}],["ssh",{"2":{"52":1,"109":3}}],["sw64",{"2":{"65":4}}],["sw",{"2":{"46":1}}],["sudo权限执行",{"0":{"51":1,"55":1}}],["sudo",{"2":{"41":1,"44":1,"51":1,"55":1,"56":1,"65":1,"109":1}}],["summary",{"0":{"29":1},"2":{"27":2}}],["shell$",{"2":{"141":1}}],["shellpip",{"2":{"118":1}}],["shelluos",{"2":{"116":1,"126":1}}],["shellautotest",{"2":{"98":1,"142":1}}],["shell",{"0":{"87":1},"2":{"41":1,"44":1,"85":1,"87":2}}],["shellmy",{"2":{"3":1,"12":1,"22":1}}],["str",{"2":{"59":6}}],["step",{"2":{"37":1}}],["status",{"2":{"59":2,"145":1}}],["staticmethod",{"2":{"4":2,"59":14}}],["static",{"2":{"3":1,"12":1,"22":3,"142":1,"147":1}}],["start",{"2":{"40":2,"41":3,"43":1,"107":2}}],["startswith",{"2":{"36":1}}],["stage",{"2":{"31":3}}],["send2pms",{"2":{"107":2}}],["secret",{"2":{"52":1}}],["setattr",{"2":{"35":1}}],["setup",{"2":{"31":1}}],["setting",{"2":{"24":2,"36":5,"59":6,"137":2}}],["self",{"2":{"13":3,"34":1,"37":1,"58":3,"74":4,"97":2,"144":1,"145":2,"146":1}}],["ifixed",{"2":{"67":2}}],["if",{"2":{"59":23,"74":1}}],["ip4",{"2":{"111":2,"112":2}}],["ip3",{"2":{"111":2,"112":2}}],["ip2",{"2":{"111":2,"112":2}}],["ip1",{"2":{"111":2,"112":2}}],["ip=",{"2":{"74":1}}],["ip=ip",{"2":{"74":1}}],["ip",{"2":{"52":1,"54":1,"55":1,"56":1,"74":1}}],["items",{"2":{"59":2}}],["it",{"2":{"32":1}}],["issue",{"2":{"119":1}}],["isinstance",{"2":{"59":4}}],["is",{"2":{"24":1,"59":6}}],["id4",{"2":{"101":3}}],["id3",{"2":{"101":3,"104":1,"105":1}}],["id2",{"2":{"101":3,"104":1,"105":1}}],["id1",{"2":{"101":3}}],["identifier",{"2":{"59":1}}],["id",{"2":{"15":2,"17":1,"18":1,"19":1,"107":5}}],["int",{"2":{"59":18}}],["install",{"2":{"41":1,"44":1,"51":1,"55":1,"56":1,"76":1,"91":6,"118":1}}],["inspect",{"2":{"35":1}}],["info",{"2":{"34":1,"36":2,"37":1,"59":11}}],["in",{"2":{"13":1,"59":2}}],["inix86",{"2":{"46":1}}],["ini",{"2":{"3":2,"12":2,"22":2,"83":1,"126":2,"137":1,"142":1}}],["init",{"2":{"1":1,"32":1,"70":2,"74":1,"92":1,"98":1,"116":3,"126":4,"141":1,"142":2}}],["import",{"2":{"4":3,"10":2,"13":4,"23":1,"24":1,"36":1,"37":2,"46":2,"50":1,"51":1,"52":1,"54":1,"55":1,"56":1,"58":3,"59":12,"74":2,"78":1,"117":1,"118":1,"127":2,"132":1,"144":2,"145":2,"146":3}}],["imagecenter",{"2":{"122":1}}],["image",{"2":{"3":1,"8":1,"12":1,"22":3,"37":4,"59":6,"81":1,"142":1,"147":1}}],["music",{"2":{"99":5,"102":6,"116":3}}],["multiple=multiple",{"2":{"37":1,"59":2}}],["multiple=false",{"2":{"37":1}}],["multiple",{"2":{"37":1,"59":2}}],["mousekey",{"2":{"122":1}}],["movie",{"2":{"116":1}}],["move",{"2":{"8":1}}],["mode",{"2":{"59":6}}],["mips64",{"2":{"46":1}}],["maintainer",{"2":{"119":1}}],["main",{"2":{"74":1}}],["manage",{"2":{"67":1,"122":1,"144":1,"145":1}}],["manager",{"0":{"13":1},"2":{"4":2,"13":3,"59":1,"74":2,"83":1,"116":2,"117":2,"118":1,"126":2,"127":1,"145":1}}],["mark",{"2":{"63":1,"100":1,"122":1}}],["max",{"2":{"59":7}}],["match",{"2":{"59":11}}],["machine",{"2":{"52":1}}],["map",{"2":{"37":1}}],["message",{"2":{"32":1}}],["metadata",{"2":{"28":1,"31":1}}],["method",{"2":{"3":4,"4":2,"6":1,"7":1,"10":1,"12":4,"13":5,"22":6,"36":1,"37":3,"40":1,"43":1,"58":4,"114":1,"116":4,"126":5,"127":1,"142":4,"144":3,"145":2,"146":4}}],["menu",{"2":{"13":1}}],["mk",{"2":{"8":1,"13":1}}],["md",{"2":{"3":4,"12":4,"22":4,"116":1,"126":1}}],["mycasemethod",{"2":{"144":1,"145":2}}],["mycase",{"2":{"3":3,"12":3,"22":3,"58":1,"98":2,"142":3,"145":2,"146":2}}],["my",{"2":{"1":2,"3":1,"12":1,"22":1,"58":1,"70":2,"87":1,"92":2,"98":1,"142":2,"144":1,"145":1}}],["└──",{"2":{"116":4,"126":5,"142":3}}],["└─",{"2":{"3":6,"12":6,"22":6}}],["auto",{"2":{"74":3}}],["autotest",{"2":{"1":2,"3":2,"12":2,"22":2,"70":2,"92":2,"114":1}}],["amp",{"2":{"65":3,"66":5}}],["album",{"2":{"62":2}}],["all",{"2":{"59":5}}],["allure",{"2":{"37":2}}],["and",{"2":{"59":3,"99":4,"100":1}}],["any",{"2":{"59":3}}],["arrch64",{"2":{"65":1}}],["args",{"2":{"59":7}}],["arch",{"2":{"28":2}}],["actual",{"2":{"59":10}}],["abspath=config",{"2":{"74":1}}],["abspath=pic",{"2":{"59":2}}],["abspath=picture",{"2":{"59":2}}],["abspath=none",{"2":{"59":2}}],["abspath",{"2":{"59":9,"74":1}}],["aarch64",{"2":{"46":1,"65":4,"66":1}}],["apt",{"2":{"41":1,"44":1,"51":1,"55":1,"56":1}}],["appname=",{"2":{"83":1}}],["app",{"2":{"37":5,"58":1,"59":10,"98":1}}],["appmethod",{"2":{"34":1,"37":2}}],["a",{"2":{"32":1}}],["attr",{"2":{"4":4,"8":1,"13":1,"34":1,"37":1,"59":2,"74":3,"80":1}}],["as",{"2":{"4":1,"10":1,"59":3}}],["assertionerror",{"2":{"59":18}}],["assertx",{"2":{"58":1}}],["assertmethod",{"2":{"13":2,"58":5,"146":5}}],["assert",{"2":{"3":2,"12":2,"13":2,"22":4,"58":6,"59":18,"126":1,"142":2,"145":1,"146":9,"147":1}}],["│\\t└──",{"2":{"98":1}}],["│\\t├──",{"2":{"98":1}}],["│",{"2":{"3":16,"12":16,"22":16,"98":5,"116":5,"126":22,"142":12}}],["├──",{"2":{"40":3,"43":3,"98":4,"116":9,"126":19,"142":17}}],["├─",{"2":{"3":17,"12":17,"22":17}}],["依赖管理文件",{"0":{"150":1},"2":{"142":1}}],["依赖管理",{"0":{"0":1},"2":{"20":1}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/VPLocalSearchBox.CWiDOOh6.js b/assets/chunks/VPLocalSearchBox.Dt6viFUH.js similarity index 99% rename from assets/chunks/VPLocalSearchBox.CWiDOOh6.js rename to assets/chunks/VPLocalSearchBox.Dt6viFUH.js index 17b1121..5c1bfef 100644 --- a/assets/chunks/VPLocalSearchBox.CWiDOOh6.js +++ b/assets/chunks/VPLocalSearchBox.Dt6viFUH.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,aj as Dt,ak as Ot,d as Rt,G as xe,al as tt,k as Fe,am as _t,an as Mt,z as Lt,ao as zt,l as Re,R as de,P as Ee,ap as Pt,aq as Bt,Y as Vt,j as $t,ar as Wt,o as ee,b as jt,m as E,a1 as Kt,p as U,as as Jt,at as Ut,au as Ht,c as re,n as rt,e as Se,E as at,F as nt,a as ve,t as pe,av as Gt,q as qt,s as Qt,aw as it,a3 as Yt,a9 as Zt,af as Xt,ax as er,_ as tr}from"./framework.DB2UoSFq.js";import{u as rr,c as ar}from"./theme.DIB_5g2S.js";const nr={root:()=>It(()=>import("./@localSearchIndexroot.D_bJN1IY.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,aj as Dt,ak as Ot,d as Rt,G as xe,al as tt,k as Fe,am as _t,an as Mt,z as Lt,ao as zt,l as Re,R as de,P as Ee,ap as Pt,aq as Bt,Y as Vt,j as $t,ar as Wt,o as ee,b as jt,m as E,a1 as Kt,p as U,as as Jt,at as Ut,au as Ht,c as re,n as rt,e as Se,E as at,F as nt,a as ve,t as pe,av as Gt,q as qt,s as Qt,aw as it,a3 as Yt,a9 as Zt,af as Xt,ax as er,_ as tr}from"./framework.DB2UoSFq.js";import{u as rr,c as ar}from"./theme.BowqbIWc.js";const nr={root:()=>It(()=>import("./@localSearchIndexroot.DmiiTrvV.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.DIB_5g2S.js b/assets/chunks/theme.BowqbIWc.js similarity index 99% rename from assets/chunks/theme.DIB_5g2S.js rename to assets/chunks/theme.BowqbIWc.js index f9c39b3..ac16957 100644 --- a/assets/chunks/theme.DIB_5g2S.js +++ b/assets/chunks/theme.BowqbIWc.js @@ -1,4 +1,4 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.CWiDOOh6.js","assets/chunks/framework.DB2UoSFq.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.DB2UoSFq.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-39225c2a"]]),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-b4d69a0b"),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-b4d69a0b"]]);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-f4ef067b"]]),Cn=n=>(Z("data-v-f1d5f0bc"),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-f1d5f0bc"]]),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-5207b98e"),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-5207b98e"]]);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-e6d29f27"]]),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-da9bd828"]]),fo=n=>(Z("data-v-e5aed501"),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-e5aed501"]]),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-70b4c594"]]),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-a3c772fb"]]),To=n=>(Z("data-v-22db75ec"),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-22db75ec"]]),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-2908087c"]]),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-25d4ed06"]]),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-5629135b"]]),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-6274197d"]]),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-48fac9ef"]]);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-57a7b996"]]),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-9df9ee96"]]);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-c5ec0895"]]),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-fcacf28d"]]),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-b2119317"]]),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-c0982df3"]]),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-23ee77ae"]]),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-87095e00"]]),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-f5a36f1b"]]),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-405b7737"]]),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-c9800f80"]]),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-8a171de0"]]),ur=n=>(Z("data-v-f746d7e0"),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-f746d7e0"]]),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-ef9c2bfa"]]),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-ca39d846"),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-ca39d846"]]);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.CWiDOOh6.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-fe082610"]]),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-15df090c"]]),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-cf938b1a"]]),Zr=n=>(Z("data-v-293f3bf8"),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-293f3bf8"]]),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-46f82938"]]),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-55da9136"]]),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-c1cc298a"]]),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-b00c649a"]]),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-31391d93"]]),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-b6d43e7d"]]),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-3dd6f37e"]]),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-9ac35370"]]),Fi=n=>(Z("data-v-e216f58b"),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-e216f58b"]]),St=n=>(Z("data-v-71cefa04"),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-71cefa04"]]),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-db2dcaee"]]),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-c9d4f922"]]),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-c649c573"]]),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-ba2c7188"]]),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-13ff0bb7"]]),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-9c4594aa"]]),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.DB2UoSFq.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-39225c2a"]]),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-b4d69a0b"),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-b4d69a0b"]]);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-f4ef067b"]]),Cn=n=>(Z("data-v-f1d5f0bc"),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-f1d5f0bc"]]),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-5207b98e"),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-5207b98e"]]);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-e6d29f27"]]),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-da9bd828"]]),fo=n=>(Z("data-v-e5aed501"),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-e5aed501"]]),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-70b4c594"]]),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-a3c772fb"]]),To=n=>(Z("data-v-22db75ec"),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-22db75ec"]]),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-2908087c"]]),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-25d4ed06"]]),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-5629135b"]]),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-6274197d"]]),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-48fac9ef"]]);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-57a7b996"]]),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-9df9ee96"]]);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-c5ec0895"]]),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-fcacf28d"]]),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-b2119317"]]),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-c0982df3"]]),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-23ee77ae"]]),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-87095e00"]]),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-f5a36f1b"]]),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-405b7737"]]),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-c9800f80"]]),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-8a171de0"]]),ur=n=>(Z("data-v-f746d7e0"),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-f746d7e0"]]),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-ef9c2bfa"]]),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-ca39d846"),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-ca39d846"]]);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.Dt6viFUH.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-fe082610"]]),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-15df090c"]]),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-cf938b1a"]]),Zr=n=>(Z("data-v-293f3bf8"),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-293f3bf8"]]),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-46f82938"]]),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-55da9136"]]),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-c1cc298a"]]),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-b00c649a"]]),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-31391d93"]]),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-b6d43e7d"]]),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-3dd6f37e"]]),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-9ac35370"]]),Fi=n=>(Z("data-v-e216f58b"),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-e216f58b"]]),St=n=>(Z("data-v-71cefa04"),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-71cefa04"]]),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-db2dcaee"]]),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-c9d4f922"]]),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-c649c573"]]),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-ba2c7188"]]),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-13ff0bb7"]]),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-9c4594aa"]]),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.CwOla-ZS.js b/assets/index.md.DaWK2gBu.js similarity index 91% rename from assets/index.md.CwOla-ZS.js rename to assets/index.md.DaWK2gBu.js index c167b11..85a060e 100644 --- a/assets/index.md.CwOla-ZS.js +++ b/assets/index.md.DaWK2gBu.js @@ -1 +1 @@ -import{V as o,a as n,b as r}from"./chunks/theme.DIB_5g2S.js";import{c as s,I as t,w as a,p as e,o as l,a as m}from"./chunks/framework.DB2UoSFq.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"YouQu3","text":"Next-Gen Linux Autotest Framework","tagline":"Easy to use, ready for production.","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":1722481721000}'),u={name:"index.md"},_=Object.assign(u,{setup(c){const i=[{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(g,p)=>(l(),s("div",null,[t(e(r),null,{default:a(()=>[t(e(o),null,{title:a(()=>[m(" Contributors ")]),_:1}),t(e(n),{size:"small",members:i})]),_:1})]))}});export{k as __pageData,_ as default}; +import{V as o,a as n,b as r}from"./chunks/theme.BowqbIWc.js";import{c as s,I as t,w as a,p as e,o as l,a as m}from"./chunks/framework.DB2UoSFq.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"YouQu3","text":"Next-Gen Linux Autotest Framework","tagline":"Easy to use, ready for production.","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":1722506302000}'),u={name:"index.md"},_=Object.assign(u,{setup(c){const i=[{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(g,p)=>(l(),s("div",null,[t(e(r),null,{default:a(()=>[t(e(o),null,{title:a(()=>[m(" Contributors ")]),_:1}),t(e(n),{size:"small",members:i})]),_:1})]))}});export{k as __pageData,_ as default}; diff --git a/assets/index.md.CwOla-ZS.lean.js b/assets/index.md.DaWK2gBu.lean.js similarity index 91% rename from assets/index.md.CwOla-ZS.lean.js rename to assets/index.md.DaWK2gBu.lean.js index c167b11..85a060e 100644 --- a/assets/index.md.CwOla-ZS.lean.js +++ b/assets/index.md.DaWK2gBu.lean.js @@ -1 +1 @@ -import{V as o,a as n,b as r}from"./chunks/theme.DIB_5g2S.js";import{c as s,I as t,w as a,p as e,o as l,a as m}from"./chunks/framework.DB2UoSFq.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"YouQu3","text":"Next-Gen Linux Autotest Framework","tagline":"Easy to use, ready for production.","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":1722481721000}'),u={name:"index.md"},_=Object.assign(u,{setup(c){const i=[{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(g,p)=>(l(),s("div",null,[t(e(r),null,{default:a(()=>[t(e(o),null,{title:a(()=>[m(" Contributors ")]),_:1}),t(e(n),{size:"small",members:i})]),_:1})]))}});export{k as __pageData,_ as default}; +import{V as o,a as n,b as r}from"./chunks/theme.BowqbIWc.js";import{c as s,I as t,w as a,p as e,o as l,a as m}from"./chunks/framework.DB2UoSFq.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"YouQu3","text":"Next-Gen Linux Autotest Framework","tagline":"Easy to use, ready for production.","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":1722506302000}'),u={name:"index.md"},_=Object.assign(u,{setup(c){const i=[{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(g,p)=>(l(),s("div",null,[t(e(r),null,{default:a(()=>[t(e(o),null,{title:a(()=>[m(" Contributors ")]),_:1}),t(e(n),{size:"small",members:i})]),_:1})]))}});export{k as __pageData,_ as default}; diff --git "a/assets/\345\256\236\350\267\265_\344\276\235\350\265\226\347\256\241\347\220\206.md.KnqyJe_d.js" "b/assets/\345\256\236\350\267\265_\344\276\235\350\265\226\347\256\241\347\220\206.md.YROidQsd.js" similarity index 89% rename from "assets/\345\256\236\350\267\265_\344\276\235\350\265\226\347\256\241\347\220\206.md.KnqyJe_d.js" rename to "assets/\345\256\236\350\267\265_\344\276\235\350\265\226\347\256\241\347\220\206.md.YROidQsd.js" index 2771b16..e56660a 100644 --- "a/assets/\345\256\236\350\267\265_\344\276\235\350\265\226\347\256\241\347\220\206.md.KnqyJe_d.js" +++ "b/assets/\345\256\236\350\267\265_\344\276\235\350\265\226\347\256\241\347\220\206.md.YROidQsd.js" @@ -1 +1 @@ -import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.DB2UoSFq.js";const u=JSON.parse('{"title":"依赖管理","description":"","frontmatter":{},"headers":[],"relativePath":"实践/依赖管理.md","filePath":"实践/依赖管理.md","lastUpdated":1722481721000}'),r={name:"实践/依赖管理.md"},c=e("h1",{id:"依赖管理",tabindex:"-1"},[o("依赖管理 "),e("a",{class:"header-anchor",href:"#依赖管理","aria-label":'Permalink to "依赖管理"'},"​")],-1),n=[c];function d(_,i,l,p,m,h){return s(),t("div",null,n)}const x=a(r,[["render",d]]);export{u as __pageData,x as default}; +import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.DB2UoSFq.js";const u=JSON.parse('{"title":"依赖管理","description":"","frontmatter":{},"headers":[],"relativePath":"实践/依赖管理.md","filePath":"实践/依赖管理.md","lastUpdated":1722506302000}'),r={name:"实践/依赖管理.md"},c=e("h1",{id:"依赖管理",tabindex:"-1"},[o("依赖管理 "),e("a",{class:"header-anchor",href:"#依赖管理","aria-label":'Permalink to "依赖管理"'},"​")],-1),n=[c];function d(_,i,l,p,m,h){return s(),t("div",null,n)}const x=a(r,[["render",d]]);export{u as __pageData,x as default}; diff --git "a/assets/\345\256\236\350\267\265_\344\276\235\350\265\226\347\256\241\347\220\206.md.KnqyJe_d.lean.js" "b/assets/\345\256\236\350\267\265_\344\276\235\350\265\226\347\256\241\347\220\206.md.YROidQsd.lean.js" similarity index 89% rename from "assets/\345\256\236\350\267\265_\344\276\235\350\265\226\347\256\241\347\220\206.md.KnqyJe_d.lean.js" rename to "assets/\345\256\236\350\267\265_\344\276\235\350\265\226\347\256\241\347\220\206.md.YROidQsd.lean.js" index 2771b16..e56660a 100644 --- "a/assets/\345\256\236\350\267\265_\344\276\235\350\265\226\347\256\241\347\220\206.md.KnqyJe_d.lean.js" +++ "b/assets/\345\256\236\350\267\265_\344\276\235\350\265\226\347\256\241\347\220\206.md.YROidQsd.lean.js" @@ -1 +1 @@ -import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.DB2UoSFq.js";const u=JSON.parse('{"title":"依赖管理","description":"","frontmatter":{},"headers":[],"relativePath":"实践/依赖管理.md","filePath":"实践/依赖管理.md","lastUpdated":1722481721000}'),r={name:"实践/依赖管理.md"},c=e("h1",{id:"依赖管理",tabindex:"-1"},[o("依赖管理 "),e("a",{class:"header-anchor",href:"#依赖管理","aria-label":'Permalink to "依赖管理"'},"​")],-1),n=[c];function d(_,i,l,p,m,h){return s(),t("div",null,n)}const x=a(r,[["render",d]]);export{u as __pageData,x as default}; +import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.DB2UoSFq.js";const u=JSON.parse('{"title":"依赖管理","description":"","frontmatter":{},"headers":[],"relativePath":"实践/依赖管理.md","filePath":"实践/依赖管理.md","lastUpdated":1722506302000}'),r={name:"实践/依赖管理.md"},c=e("h1",{id:"依赖管理",tabindex:"-1"},[o("依赖管理 "),e("a",{class:"header-anchor",href:"#依赖管理","aria-label":'Permalink to "依赖管理"'},"​")],-1),n=[c];function d(_,i,l,p,m,h){return s(),t("div",null,n)}const x=a(r,[["render",d]]);export{u as __pageData,x as default}; diff --git "a/assets/\345\256\236\350\267\265_\345\267\245\347\250\213\345\210\233\345\273\272.md.CEbpbhG1.js" "b/assets/\345\256\236\350\267\265_\345\267\245\347\250\213\345\210\233\345\273\272.md.CEbpbhG1.js" deleted file mode 100644 index 4e93a18..0000000 --- "a/assets/\345\256\236\350\267\265_\345\267\245\347\250\213\345\210\233\345\273\272.md.CEbpbhG1.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.DB2UoSFq.js";const u=JSON.parse('{"title":"工程创建","description":"","frontmatter":{},"headers":[],"relativePath":"实践/工程创建.md","filePath":"实践/工程创建.md","lastUpdated":1722481721000}'),r={name:"实践/工程创建.md"},c=e("h1",{id:"工程创建",tabindex:"-1"},[o("工程创建 "),e("a",{class:"header-anchor",href:"#工程创建","aria-label":'Permalink to "工程创建"'},"​")],-1),n=[c];function d(_,i,l,p,m,h){return s(),t("div",null,n)}const x=a(r,[["render",d]]);export{u as __pageData,x as default}; diff --git "a/assets/\345\256\236\350\267\265_\345\267\245\347\250\213\345\210\233\345\273\272.md.CEbpbhG1.lean.js" "b/assets/\345\256\236\350\267\265_\345\267\245\347\250\213\345\210\233\345\273\272.md.CEbpbhG1.lean.js" deleted file mode 100644 index 4e93a18..0000000 --- "a/assets/\345\256\236\350\267\265_\345\267\245\347\250\213\345\210\233\345\273\272.md.CEbpbhG1.lean.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.DB2UoSFq.js";const u=JSON.parse('{"title":"工程创建","description":"","frontmatter":{},"headers":[],"relativePath":"实践/工程创建.md","filePath":"实践/工程创建.md","lastUpdated":1722481721000}'),r={name:"实践/工程创建.md"},c=e("h1",{id:"工程创建",tabindex:"-1"},[o("工程创建 "),e("a",{class:"header-anchor",href:"#工程创建","aria-label":'Permalink to "工程创建"'},"​")],-1),n=[c];function d(_,i,l,p,m,h){return s(),t("div",null,n)}const x=a(r,[["render",d]]);export{u as __pageData,x as default}; diff --git "a/assets/\345\256\236\350\267\265_\345\267\245\347\250\213\345\210\233\345\273\272.md.DxxIOgWb.js" "b/assets/\345\256\236\350\267\265_\345\267\245\347\250\213\345\210\233\345\273\272.md.DxxIOgWb.js" new file mode 100644 index 0000000..a6f7fce --- /dev/null +++ "b/assets/\345\256\236\350\267\265_\345\267\245\347\250\213\345\210\233\345\273\272.md.DxxIOgWb.js" @@ -0,0 +1,2 @@ +import{_ as s}from"./chunks/init.CN3wm6Mq.js";import{_ as a,c as t,o as i,U as e}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"工程创建","description":"","frontmatter":{},"headers":[],"relativePath":"实践/工程创建.md","filePath":"实践/工程创建.md","lastUpdated":1722506302000}'),n={name:"实践/工程创建.md"},p=e(`

工程创建

创建一个工程目录:

bash
mkdir my_autotest

使用脚手架工具创建用例工程:

bash
cd my_autotest/
+youqu3 init

',6),l=[p];function o(h,c,d,r,_,k){return i(),t("div",null,l)}const F=a(n,[["render",o]]);export{g as __pageData,F as default}; diff --git "a/assets/\345\256\236\350\267\265_\345\267\245\347\250\213\345\210\233\345\273\272.md.DxxIOgWb.lean.js" "b/assets/\345\256\236\350\267\265_\345\267\245\347\250\213\345\210\233\345\273\272.md.DxxIOgWb.lean.js" new file mode 100644 index 0000000..13beafb --- /dev/null +++ "b/assets/\345\256\236\350\267\265_\345\267\245\347\250\213\345\210\233\345\273\272.md.DxxIOgWb.lean.js" @@ -0,0 +1 @@ +import{_ as s}from"./chunks/init.CN3wm6Mq.js";import{_ as a,c as t,o as i,U as e}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"工程创建","description":"","frontmatter":{},"headers":[],"relativePath":"实践/工程创建.md","filePath":"实践/工程创建.md","lastUpdated":1722506302000}'),n={name:"实践/工程创建.md"},p=e("",6),l=[p];function o(h,c,d,r,_,k){return i(),t("div",null,l)}const F=a(n,[["render",o]]);export{g 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.CPCZKS3A.js" "b/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.CPCZKS3A.js" new file mode 100644 index 0000000..e89943a --- /dev/null +++ "b/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.CPCZKS3A.js" @@ -0,0 +1,50 @@ +import{_ as s,c as i,o as a,U as t}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"方法开发","description":"","frontmatter":{},"headers":[],"relativePath":"实践/方法开发.md","filePath":"实践/方法开发.md","lastUpdated":1722506302000}'),n={name:"实践/方法开发.md"},l=t(`

方法开发

方法模块路径

shell
my_autotest
+├─ case
+   ├─ assert_res
+   └─ README.md
+   ├─ base_case.py
+   ├─ test_mycase_001.py
+   └─ test_mycase_002.py
+├─ method      <--方法模块
+   ├─ image_res
+   └─ README.md
+   ├─ static_res
+   └─ README.md
+   ├─ assert_method.py
+   ├─ base_method.py
+   ├─ my_autotest_method.py
+   └─ ui.ini
+├─ .gitignore
+├─ README.md
+├─ config.py  
+├─ conftest.py
+├─ mycase.csv
+├─ pytest.ini
+├─ requirements.txt
+└─ ruff.toml

以 dde-dock 方法举例

dde_dock_method.py

python
from funnylog2.config import config as log_config
+from youqu3 import log
+from youqu3.gui import pylinuxauto
+
+log_config.CLASS_NAME_ENDSWITH = "Method"
+
+@log
+class DdeDockMethod():
+
+    @staticmethod
+    def click_dde_file_manager_on_dock_by_attr():
+        """在任务栏点击文件管理器"""
+        pylinuxauto.find_element_by_attr_path("/dde-dock/Btn_文件管理器").click()
+	
+    @staticmethod
+    def right_click_dde_file_manager_on_dock_by_attr():
+        """在任务栏右键点击文件管理器"""
+        pylinuxauto.find_element_by_attr_path("/dde-dock/Btn_文件管理器").right_click()

遵循 PO 设计模式:一个页面一个类,一个元素一个方法

实践规范

方法文件名称

  • 小驼峰命名。
  • 应用名称开头,如果应用涉及的页面较多需要做划分,可以用页面的名称。
  • method 结尾。

类名称

  • 大驼峰命名。
  • 应用名称开头,如果应用涉及的页面较多需要做划分,可以用页面的名称。
  • Method 结尾。

方法名称

python
def {动词}_{对象}_{位置}_{元素定位方式}():
+    ...
  • 动词开头。

    方法动词开头列表

    名称单词
    左键点击click
    右键点击right_click
    双击double_click
    移动move_to
    拖动drag
    新建new
    拖动到drag_to
  • 对象,能够直接表示元素对象即可。

  • 位置,对象所在的位置,或者是哪个应用的。

  • 元素定位方式

    方法动词开头列表

    名称表达式
    属性定位by_attr
    图像识别by_image
    OCR识别by_ocr
    相对位置定位by_ui
    键鼠操作by_mk

函数注释

python
def func():
+    """函数注释"""

日志

全自动输出日志,只需要一个类装饰器。

python
from funnylog2.config import config as log_config
+from youqu3 import log
+
+log_config.CLASS_NAME_ENDSWITH = "Method"
+
+@log
+class DdeDockMethod():
+    ...
`,19),h=[l];function e(p,k,d,r,o,c){return a(),i("div",null,h)}const y=s(n,[["render",e]]);export{g as __pageData,y 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.CPCZKS3A.lean.js" "b/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.CPCZKS3A.lean.js" new file mode 100644 index 0000000..5a136d2 --- /dev/null +++ "b/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.CPCZKS3A.lean.js" @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,U as t}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"方法开发","description":"","frontmatter":{},"headers":[],"relativePath":"实践/方法开发.md","filePath":"实践/方法开发.md","lastUpdated":1722506302000}'),n={name:"实践/方法开发.md"},l=t("",19),h=[l];function e(p,k,d,r,o,c){return a(),i("div",null,h)}const y=s(n,[["render",e]]);export{g as __pageData,y 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.Pi9b8NLI.js" "b/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.Pi9b8NLI.js" deleted file mode 100644 index 8af077d..0000000 --- "a/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.Pi9b8NLI.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.DB2UoSFq.js";const u=JSON.parse('{"title":"方法开发","description":"","frontmatter":{},"headers":[],"relativePath":"实践/方法开发.md","filePath":"实践/方法开发.md","lastUpdated":1722481721000}'),r={name:"实践/方法开发.md"},c=e("h1",{id:"方法开发",tabindex:"-1"},[o("方法开发 "),e("a",{class:"header-anchor",href:"#方法开发","aria-label":'Permalink to "方法开发"'},"​")],-1),n=[c];function d(_,i,l,p,m,h){return s(),t("div",null,n)}const x=a(r,[["render",d]]);export{u as __pageData,x 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.Pi9b8NLI.lean.js" "b/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.Pi9b8NLI.lean.js" deleted file mode 100644 index 8af077d..0000000 --- "a/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.Pi9b8NLI.lean.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.DB2UoSFq.js";const u=JSON.parse('{"title":"方法开发","description":"","frontmatter":{},"headers":[],"relativePath":"实践/方法开发.md","filePath":"实践/方法开发.md","lastUpdated":1722481721000}'),r={name:"实践/方法开发.md"},c=e("h1",{id:"方法开发",tabindex:"-1"},[o("方法开发 "),e("a",{class:"header-anchor",href:"#方法开发","aria-label":'Permalink to "方法开发"'},"​")],-1),n=[c];function d(_,i,l,p,m,h){return s(),t("div",null,n)}const x=a(r,[["render",d]]);export{u as __pageData,x 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.B1K8cEop.js" "b/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.B1K8cEop.js" deleted file mode 100644 index ff10cc6..0000000 --- "a/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.B1K8cEop.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.DB2UoSFq.js";const u=JSON.parse('{"title":"用例开发","description":"","frontmatter":{},"headers":[],"relativePath":"实践/用例开发.md","filePath":"实践/用例开发.md","lastUpdated":1722481721000}'),r={name:"实践/用例开发.md"},c=e("h1",{id:"用例开发",tabindex:"-1"},[o("用例开发 "),e("a",{class:"header-anchor",href:"#用例开发","aria-label":'Permalink to "用例开发"'},"​")],-1),n=[c];function d(_,i,l,p,m,h){return s(),t("div",null,n)}const x=a(r,[["render",d]]);export{u as __pageData,x 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.B1K8cEop.lean.js" "b/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.B1K8cEop.lean.js" deleted file mode 100644 index ff10cc6..0000000 --- "a/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.B1K8cEop.lean.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.DB2UoSFq.js";const u=JSON.parse('{"title":"用例开发","description":"","frontmatter":{},"headers":[],"relativePath":"实践/用例开发.md","filePath":"实践/用例开发.md","lastUpdated":1722481721000}'),r={name:"实践/用例开发.md"},c=e("h1",{id:"用例开发",tabindex:"-1"},[o("用例开发 "),e("a",{class:"header-anchor",href:"#用例开发","aria-label":'Permalink to "用例开发"'},"​")],-1),n=[c];function d(_,i,l,p,m,h){return s(),t("div",null,n)}const x=a(r,[["render",d]]);export{u as __pageData,x 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.C9U8TJiv.js" "b/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.C9U8TJiv.js" new file mode 100644 index 0000000..b34c1fc --- /dev/null +++ "b/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.C9U8TJiv.js" @@ -0,0 +1,50 @@ +import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"用例开发","description":"","frontmatter":{},"headers":[],"relativePath":"实践/用例开发.md","filePath":"实践/用例开发.md","lastUpdated":1722506302000}'),l={name:"实践/用例开发.md"},h=n(`

用例开发

用例模块路径

shell
my_autotest
+├─ case    <--用例模块
+   ├─ assert_res
+   └─ README.md
+   ├─ base_case.py
+   ├─ test_mycase_001.py
+   └─ test_mycase_002.py v
+├─ method      
+   ├─ image_res
+   └─ README.md
+   ├─ static_res
+   └─ README.md
+   ├─ assert_method.py
+   ├─ base_method.py
+   ├─ my_autotest_method.py
+   └─ ui.ini
+├─ .gitignore
+├─ README.md
+├─ config.py  
+├─ conftest.py
+├─ mycase.csv
+├─ pytest.ini
+├─ requirements.txt
+└─ ruff.toml

以 dde-file-manager 用例举例

case/base_case.py

python
from method.assert_method import AssertMethod
+
+
+class BaseCase(AssertMethod):
+    ...

test_dfm_001.py

python
from youqu3 import sleep
+
+from case.base_case import BaseCase
+from method.dde_dock_method import DdeDockMethod
+
+
+class TestDfm(BaseCase):
+
+    def test_dfm_1159151(self):
+        """任务栏右键启动文件管理器"""
+        # 右键点击任务栏上的文件管理器
+        DdeDockMethod.right_click_dde_file_manager_on_dock_by_attr()
+        # 点击右键菜单中的“打开”
+        DdeDockMethod.click_open_in_right_menu_by_mk()
+        sleep(2)
+        # 断言
+        self.assert_process_exist("dde-file-manager")
+
+    def teardown_method(self):
+        """teardown"""
+        DdeDockMethod.kill_process("dde-file-manager")

实践规范

用例文件名称

bash
test_{case_name}_{case_id}.py
  • 小驼峰命名。
  • test_ 开头。
  • case_id 结尾。

类名称

  • 大驼峰命名。
  • Test 开头。
  • 用例名称 结尾,所有用例可以使用相同的类名。
  • 继承 BaseCase

用例函数

python
def test_{case_name}_{case_id}():
+    ...

用例注释

python
def test_{case_name}_{case_id}():
+    """用例标题"""    <--用例注释 

CSV文件

  • CSV文件名称对应用例文件名称的 case_name{case_name}.csv
  • 第一列写 case_id
`,18),t=[h];function e(p,k,d,r,F,c){return a(),i("div",null,t)}const y=s(l,[["render",e]]);export{g as __pageData,y 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.C9U8TJiv.lean.js" "b/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.C9U8TJiv.lean.js" new file mode 100644 index 0000000..4a9cf97 --- /dev/null +++ "b/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.C9U8TJiv.lean.js" @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"用例开发","description":"","frontmatter":{},"headers":[],"relativePath":"实践/用例开发.md","filePath":"实践/用例开发.md","lastUpdated":1722506302000}'),l={name:"实践/用例开发.md"},h=n("",18),t=[h];function e(p,k,d,r,F,c){return a(),i("div",null,t)}const y=s(l,[["render",e]]);export{g as __pageData,y as default}; diff --git "a/assets/\345\256\236\350\267\265_\347\256\200\344\273\213.md.BH5RfU1H.js" "b/assets/\345\256\236\350\267\265_\347\256\200\344\273\213.md.BH5RfU1H.js" deleted file mode 100644 index 1c40503..0000000 --- "a/assets/\345\256\236\350\267\265_\347\256\200\344\273\213.md.BH5RfU1H.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,U as l}from"./chunks/framework.DB2UoSFq.js";const f=JSON.parse('{"title":"从零开始构建自动化工程","description":"","frontmatter":{},"headers":[],"relativePath":"实践/简介.md","filePath":"实践/简介.md","lastUpdated":1722481721000}'),r={name:"实践/简介.md"},_=l('

从零开始构建自动化工程

我们将指导如何基于 YouQu3 从零开始构建一个完成的自动化用例工程。

按照以下章节:

  • 工程创建:使用 YouQu3 官方提供的脚手架工具,快速创建一个自动化用例工程模板。

  • 配置模块:介绍自动化用例工程配置模块如何管理配置。

  • 方法开发:使用 PO 设计理念进行方法封装,方法类如何组织,提高可维护性。

  • 用例开发:按照业务流程调用方法进行用例代码开发,Fixture 如何编写。

  • 依赖管理:如何管理自动化用例工程的依赖项。

',4),i=[_];function o(p,s,c,h,n,d){return t(),e("div",null,i)}const u=a(r,[["render",o]]);export{f as __pageData,u as default}; diff --git "a/assets/\345\256\236\350\267\265_\347\256\200\344\273\213.md.BndrkXrm.js" "b/assets/\345\256\236\350\267\265_\347\256\200\344\273\213.md.BndrkXrm.js" new file mode 100644 index 0000000..6f92209 --- /dev/null +++ "b/assets/\345\256\236\350\267\265_\347\256\200\344\273\213.md.BndrkXrm.js" @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,U as l}from"./chunks/framework.DB2UoSFq.js";const f=JSON.parse('{"title":"从零开始构建自动化工程","description":"","frontmatter":{},"headers":[],"relativePath":"实践/简介.md","filePath":"实践/简介.md","lastUpdated":1722506302000}'),r={name:"实践/简介.md"},_=l('

从零开始构建自动化工程

我们将指导如何基于 YouQu3 从零开始构建一个完成的自动化用例工程。

按照以下章节:

  • 工程创建:使用 YouQu3 官方提供的脚手架工具,快速创建一个自动化用例工程模板。
  • 方法开发:使用 PO 设计理念进行方法封装,方法类如何组织,提高可维护性。
  • 用例开发:按照业务流程调用方法进行用例代码开发,Fixture 如何编写。
  • 配置模块:介绍自动化用例工程配置模块如何管理配置。
  • 依赖管理:如何管理自动化用例工程的依赖项。
',4),i=[_];function o(s,c,h,n,d,p){return t(),e("div",null,i)}const u=a(r,[["render",o]]);export{f as __pageData,u as default}; diff --git "a/assets/\345\256\236\350\267\265_\347\256\200\344\273\213.md.BH5RfU1H.lean.js" "b/assets/\345\256\236\350\267\265_\347\256\200\344\273\213.md.BndrkXrm.lean.js" similarity index 70% rename from "assets/\345\256\236\350\267\265_\347\256\200\344\273\213.md.BH5RfU1H.lean.js" rename to "assets/\345\256\236\350\267\265_\347\256\200\344\273\213.md.BndrkXrm.lean.js" index 5bf3090..58aaa94 100644 --- "a/assets/\345\256\236\350\267\265_\347\256\200\344\273\213.md.BH5RfU1H.lean.js" +++ "b/assets/\345\256\236\350\267\265_\347\256\200\344\273\213.md.BndrkXrm.lean.js" @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as l}from"./chunks/framework.DB2UoSFq.js";const f=JSON.parse('{"title":"从零开始构建自动化工程","description":"","frontmatter":{},"headers":[],"relativePath":"实践/简介.md","filePath":"实践/简介.md","lastUpdated":1722481721000}'),r={name:"实践/简介.md"},_=l("",4),i=[_];function o(p,s,c,h,n,d){return t(),e("div",null,i)}const u=a(r,[["render",o]]);export{f as __pageData,u as default}; +import{_ as a,c as e,o as t,U as l}from"./chunks/framework.DB2UoSFq.js";const f=JSON.parse('{"title":"从零开始构建自动化工程","description":"","frontmatter":{},"headers":[],"relativePath":"实践/简介.md","filePath":"实践/简介.md","lastUpdated":1722506302000}'),r={name:"实践/简介.md"},_=l("",4),i=[_];function o(s,c,h,n,d,p){return t(),e("div",null,i)}const u=a(r,[["render",o]]);export{f as __pageData,u as default}; diff --git "a/assets/\345\256\236\350\267\265_\351\205\215\347\275\256\346\250\241\345\235\227.md.B8xvQ7s-.js" "b/assets/\345\256\236\350\267\265_\351\205\215\347\275\256\346\250\241\345\235\227.md.B8xvQ7s-.js" deleted file mode 100644 index 8ac74ef..0000000 --- "a/assets/\345\256\236\350\267\265_\351\205\215\347\275\256\346\250\241\345\235\227.md.B8xvQ7s-.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.DB2UoSFq.js";const u=JSON.parse('{"title":"配置模块","description":"","frontmatter":{},"headers":[],"relativePath":"实践/配置模块.md","filePath":"实践/配置模块.md","lastUpdated":1722481721000}'),r={name:"实践/配置模块.md"},c=e("h1",{id:"配置模块",tabindex:"-1"},[o("配置模块 "),e("a",{class:"header-anchor",href:"#配置模块","aria-label":'Permalink to "配置模块"'},"​")],-1),n=[c];function d(_,i,l,p,m,h){return s(),t("div",null,n)}const x=a(r,[["render",d]]);export{u as __pageData,x as default}; diff --git "a/assets/\345\256\236\350\267\265_\351\205\215\347\275\256\346\250\241\345\235\227.md.B8xvQ7s-.lean.js" "b/assets/\345\256\236\350\267\265_\351\205\215\347\275\256\346\250\241\345\235\227.md.B8xvQ7s-.lean.js" deleted file mode 100644 index 8ac74ef..0000000 --- "a/assets/\345\256\236\350\267\265_\351\205\215\347\275\256\346\250\241\345\235\227.md.B8xvQ7s-.lean.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.DB2UoSFq.js";const u=JSON.parse('{"title":"配置模块","description":"","frontmatter":{},"headers":[],"relativePath":"实践/配置模块.md","filePath":"实践/配置模块.md","lastUpdated":1722481721000}'),r={name:"实践/配置模块.md"},c=e("h1",{id:"配置模块",tabindex:"-1"},[o("配置模块 "),e("a",{class:"header-anchor",href:"#配置模块","aria-label":'Permalink to "配置模块"'},"​")],-1),n=[c];function d(_,i,l,p,m,h){return s(),t("div",null,n)}const x=a(r,[["render",d]]);export{u as __pageData,x as default}; diff --git "a/assets/\345\256\236\350\267\265_\351\205\215\347\275\256\346\250\241\345\235\227.md.DEfceMjg.js" "b/assets/\345\256\236\350\267\265_\351\205\215\347\275\256\346\250\241\345\235\227.md.DEfceMjg.js" new file mode 100644 index 0000000..b0e1ef1 --- /dev/null +++ "b/assets/\345\256\236\350\267\265_\351\205\215\347\275\256\346\250\241\345\235\227.md.DEfceMjg.js" @@ -0,0 +1,39 @@ +import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const c=JSON.parse('{"title":"配置模块","description":"","frontmatter":{},"headers":[],"relativePath":"实践/配置模块.md","filePath":"实践/配置模块.md","lastUpdated":1722506302000}'),h={name:"实践/配置模块.md"},p=n(`

配置模块

配置模块路径

shell
my_autotest
+├─ case
+   ├─ assert_res
+   └─ README.md
+   ├─ base_case.py
+   ├─ test_mycase_001.py
+   └─ test_mycase_002.py
+├─ method
+   ├─ image_res
+   └─ README.md
+   ├─ static_res
+   └─ README.md
+   ├─ assert_method.py
+   ├─ base_method.py
+   ├─ my_autotest_method.py
+   └─ ui.ini
+├─ .gitignore
+├─ README.md
+├─ config.py  <--工程配置
+├─ conftest.py
+├─ mycase.csv
+├─ pytest.ini
+├─ requirements.txt
+└─ ruff.toml

config.py

python
import pathlib
+
+
+class _Config:
+
+    ROOTDIR = pathlib.Path(__file__).parent
+    ASSERT_RES = ROOTDIR / "case/assert_res"
+    IMAGE_RES = ROOTDIR / "method/image_res"
+    STATIC_RES = ROOTDIR / "method/static_res"
+
+
+config = _Config()

可以根据需要在里面添加配置。

代码中调用

python
from config import config
+
+config.ROOTDIR

调用YouQu3的配置

python
from youqu3 import setting
+
+setting.IS_X11
`,9),t=[p];function l(k,e,F,d,r,g){return a(),i("div",null,t)}const o=s(h,[["render",l]]);export{c as __pageData,o as default}; diff --git "a/assets/\345\256\236\350\267\265_\351\205\215\347\275\256\346\250\241\345\235\227.md.DEfceMjg.lean.js" "b/assets/\345\256\236\350\267\265_\351\205\215\347\275\256\346\250\241\345\235\227.md.DEfceMjg.lean.js" new file mode 100644 index 0000000..5cca83a --- /dev/null +++ "b/assets/\345\256\236\350\267\265_\351\205\215\347\275\256\346\250\241\345\235\227.md.DEfceMjg.lean.js" @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const c=JSON.parse('{"title":"配置模块","description":"","frontmatter":{},"headers":[],"relativePath":"实践/配置模块.md","filePath":"实践/配置模块.md","lastUpdated":1722506302000}'),h={name:"实践/配置模块.md"},p=n("",9),t=[p];function l(k,e,F,d,r,g){return a(),i("div",null,t)}const o=s(h,[["render",l]]);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_JSON\346\212\245\345\221\212.md.kgapLy4Z.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.C8Y-pg-e.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.kgapLy4Z.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.C8Y-pg-e.js" index dd71d3a..581b95a 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.kgapLy4Z.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.C8Y-pg-e.js" @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const y=JSON.parse('{"title":"JSON 报告","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/JSON报告.md","filePath":"指南/与生俱来/JSON报告.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const y=JSON.parse('{"title":"JSON 报告","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/JSON报告.md","filePath":"指南/与生俱来/JSON报告.md","lastUpdated":1722506302000}'),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.kgapLy4Z.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.C8Y-pg-e.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.kgapLy4Z.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.C8Y-pg-e.lean.js"
index 9835242..08776b3 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.kgapLy4Z.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.C8Y-pg-e.lean.js"
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const y=JSON.parse('{"title":"JSON 报告","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/JSON报告.md","filePath":"指南/与生俱来/JSON报告.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const y=JSON.parse('{"title":"JSON 报告","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/JSON报告.md","filePath":"指南/与生俱来/JSON报告.md","lastUpdated":1722506302000}'),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.BzQXJSiU.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.BHFXWNaq.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.BzQXJSiU.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.BHFXWNaq.js"
index 1120bcd..cecbce6 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.BzQXJSiU.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.BHFXWNaq.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.DB2UoSFq.js";const u=JSON.parse('{"title":"全自动日志","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/全自动日志.md","filePath":"指南/与生俱来/全自动日志.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const u=JSON.parse('{"title":"全自动日志","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/全自动日志.md","filePath":"指南/与生俱来/全自动日志.md","lastUpdated":1722506302000}'),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.BzQXJSiU.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.BHFXWNaq.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.BzQXJSiU.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.BHFXWNaq.lean.js"
index d5415d5..87d8080 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.BzQXJSiU.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.BHFXWNaq.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.DB2UoSFq.js";const u=JSON.parse('{"title":"全自动日志","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/全自动日志.md","filePath":"指南/与生俱来/全自动日志.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const u=JSON.parse('{"title":"全自动日志","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/全自动日志.md","filePath":"指南/与生俱来/全自动日志.md","lastUpdated":1722506302000}'),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.BOdewZBn.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.t7JPiBsf.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.BOdewZBn.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.t7JPiBsf.js"
index e799987..0ed41a4 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.BOdewZBn.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.t7JPiBsf.js"
@@ -1,4 +1,4 @@
-import{_ as s,c as a,o as i,U as t}from"./chunks/framework.DB2UoSFq.js";const F=JSON.parse('{"title":"前后钩子","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/前后钩子.md","filePath":"指南/与生俱来/前后钩子.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const F=JSON.parse('{"title":"前后钩子","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/前后钩子.md","filePath":"指南/与生俱来/前后钩子.md","lastUpdated":1722506302000}'),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.BOdewZBn.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.t7JPiBsf.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.BOdewZBn.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.t7JPiBsf.lean.js"
index 4f63a39..9f78de8 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.BOdewZBn.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.t7JPiBsf.lean.js"
@@ -1 +1 @@
-import{_ as s,c as a,o as i,U as t}from"./chunks/framework.DB2UoSFq.js";const F=JSON.parse('{"title":"前后钩子","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/前后钩子.md","filePath":"指南/与生俱来/前后钩子.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const F=JSON.parse('{"title":"前后钩子","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/前后钩子.md","filePath":"指南/与生俱来/前后钩子.md","lastUpdated":1722506302000}'),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.CVacz-37.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.CXJSwiEL.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.CVacz-37.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.CXJSwiEL.js"
index d799313..b0240c1 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.CVacz-37.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.CXJSwiEL.js"
@@ -1,4 +1,4 @@
-import{_ as s,c as a,o as i,U as t}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"动态等待","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/动态等待.md","filePath":"指南/与生俱来/动态等待.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const g=JSON.parse('{"title":"动态等待","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/动态等待.md","filePath":"指南/与生俱来/动态等待.md","lastUpdated":1722506302000}'),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.CVacz-37.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.CXJSwiEL.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.CVacz-37.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.CXJSwiEL.lean.js"
    index f9fa01e..45d85a1 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.CVacz-37.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.CXJSwiEL.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as a,o as i,U as t}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"动态等待","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/动态等待.md","filePath":"指南/与生俱来/动态等待.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const g=JSON.parse('{"title":"动态等待","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/动态等待.md","filePath":"指南/与生俱来/动态等待.md","lastUpdated":1722506302000}'),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.05C5s7jI.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.1kLbBdVe.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.05C5s7jI.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.1kLbBdVe.js"
    index 1f8f068..edbf1dd 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.05C5s7jI.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.1kLbBdVe.js"
    @@ -1,4 +1,4 @@
    -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.DB2UoSFq.js";const u=JSON.parse('{"title":"命令行交互","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/命令行交互.md","filePath":"指南/与生俱来/命令行交互.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const u=JSON.parse('{"title":"命令行交互","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/命令行交互.md","filePath":"指南/与生俱来/命令行交互.md","lastUpdated":1722506302000}'),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.05C5s7jI.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.1kLbBdVe.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.05C5s7jI.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.1kLbBdVe.lean.js"
    index 5ac68fc..7271ccc 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.05C5s7jI.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.1kLbBdVe.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.DB2UoSFq.js";const u=JSON.parse('{"title":"命令行交互","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/命令行交互.md","filePath":"指南/与生俱来/命令行交互.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const u=JSON.parse('{"title":"命令行交互","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/命令行交互.md","filePath":"指南/与生俱来/命令行交互.md","lastUpdated":1722506302000}'),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.QPUOGbQS.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.DmB4CNKW.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.QPUOGbQS.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.DmB4CNKW.js"
    index 73939b0..f8a80db 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.QPUOGbQS.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.DmB4CNKW.js"
    @@ -1,4 +1,4 @@
    -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const y=JSON.parse('{"title":"断言语句","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/断言语句.md","filePath":"指南/与生俱来/断言语句.md","lastUpdated":1722481721000}'),h={name:"指南/与生俱来/断言语句.md"},k=n(`

    断言语句

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

    用例中使用方法

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

    python
    # assert_method.py
    +import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const y=JSON.parse('{"title":"断言语句","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/断言语句.md","filePath":"指南/与生俱来/断言语句.md","lastUpdated":1722506302000}'),h={name:"指南/与生俱来/断言语句.md"},k=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.QPUOGbQS.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.DmB4CNKW.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.QPUOGbQS.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.DmB4CNKW.lean.js"
    index 2c11bee..89c5f74 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.QPUOGbQS.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.DmB4CNKW.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const y=JSON.parse('{"title":"断言语句","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/断言语句.md","filePath":"指南/与生俱来/断言语句.md","lastUpdated":1722481721000}'),h={name:"指南/与生俱来/断言语句.md"},k=n("",11),p=[k];function l(t,e,E,r,F,d){return a(),i("div",null,p)}const C=s(h,[["render",l]]);export{y as __pageData,C as default};
    +import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const y=JSON.parse('{"title":"断言语句","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/断言语句.md","filePath":"指南/与生俱来/断言语句.md","lastUpdated":1722506302000}'),h={name:"指南/与生俱来/断言语句.md"},k=n("",11),p=[k];function l(t,e,E,r,F,d){return a(),i("div",null,p)}const C=s(h,[["render",l]]);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_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.D6YGsBJk.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.C8yulHa6.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.D6YGsBJk.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.C8yulHa6.js"
    index aba43bd..6d0aba6 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.D6YGsBJk.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.C8yulHa6.js"
    @@ -1 +1 @@
    -import{_ as t,c as e,o as d,U as a}from"./chunks/framework.DB2UoSFq.js";const b=JSON.parse('{"title":"标签化管理","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/标签化管理.md","filePath":"指南/与生俱来/标签化管理.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const b=JSON.parse('{"title":"标签化管理","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/标签化管理.md","filePath":"指南/与生俱来/标签化管理.md","lastUpdated":1722506302000}'),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.D6YGsBJk.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.C8yulHa6.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.D6YGsBJk.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.C8yulHa6.lean.js" index 5143a0b..75753b6 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.D6YGsBJk.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.C8yulHa6.lean.js" @@ -1 +1 @@ -import{_ as t,c as e,o as d,U as a}from"./chunks/framework.DB2UoSFq.js";const b=JSON.parse('{"title":"标签化管理","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/标签化管理.md","filePath":"指南/与生俱来/标签化管理.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const b=JSON.parse('{"title":"标签化管理","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/标签化管理.md","filePath":"指南/与生俱来/标签化管理.md","lastUpdated":1722506302000}'),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.Dz2AiDDo.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.i_k3Y0oH.js" similarity index 93% 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.Dz2AiDDo.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.i_k3Y0oH.js" index d91a8dc..6b495a4 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.Dz2AiDDo.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.i_k3Y0oH.js" @@ -1,2 +1,2 @@ -import{_ as s}from"./chunks/init.CN3wm6Mq.js";import{_ as a,c as t,o as i,U as e}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"脚手架工具","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/脚手架工具.md","filePath":"指南/与生俱来/脚手架工具.md","lastUpdated":1722481721000}'),l={name:"指南/与生俱来/脚手架工具.md"},n=e(`

    脚手架工具

    使用子命令 init 创建用例工程,工程遵循完整的 PO 设计模式,让你可以专注于用例和方法的编写维护。

    • 创建一个目录
    bash
    mkdir my_autotest
    • 使用脚手架功能创建用例工程
    bash
    cd my_autotest/
    +import{_ as s}from"./chunks/init.CN3wm6Mq.js";import{_ as a,c as t,o as i,U as e}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"脚手架工具","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/脚手架工具.md","filePath":"指南/与生俱来/脚手架工具.md","lastUpdated":1722506302000}'),l={name:"指南/与生俱来/脚手架工具.md"},n=e(`

    脚手架工具

    使用子命令 init 创建用例工程,工程遵循完整的 PO 设计模式,让你可以专注于用例和方法的编写维护。

    • 创建一个目录
    bash
    mkdir my_autotest
    • 使用脚手架工具创建用例工程
    bash
    cd my_autotest/
     youqu3 init

    ',7),p=[n];function o(h,c,d,r,_,k){return i(),t("div",null,p)}const F=a(l,[["render",o]]);export{g 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.Dz2AiDDo.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.i_k3Y0oH.lean.js" similarity index 88% 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.Dz2AiDDo.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.i_k3Y0oH.lean.js" index d9ec14f..d0111cd 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.Dz2AiDDo.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.i_k3Y0oH.lean.js" @@ -1 +1 @@ -import{_ as s}from"./chunks/init.CN3wm6Mq.js";import{_ as a,c as t,o as i,U as e}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"脚手架工具","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/脚手架工具.md","filePath":"指南/与生俱来/脚手架工具.md","lastUpdated":1722481721000}'),l={name:"指南/与生俱来/脚手架工具.md"},n=e("",7),p=[n];function o(h,c,d,r,_,k){return i(),t("div",null,p)}const F=a(l,[["render",o]]);export{g as __pageData,F as default}; +import{_ as s}from"./chunks/init.CN3wm6Mq.js";import{_ as a,c as t,o as i,U as e}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"脚手架工具","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/脚手架工具.md","filePath":"指南/与生俱来/脚手架工具.md","lastUpdated":1722506302000}'),l={name:"指南/与生俱来/脚手架工具.md"},n=e("",7),p=[n];function o(h,c,d,r,_,k){return i(),t("div",null,p)}const F=a(l,[["render",o]]);export{g 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.C-njjJ_V.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.Vr1K94la.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.C-njjJ_V.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.Vr1K94la.js" index a2eb49f..2748115 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.C-njjJ_V.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.Vr1K94la.js" @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const p="/youqu3/%E6%8C%87%E5%8D%97/%E4%B8%8E%E7%94%9F%E4%BF%B1%E6%9D%A5/remote_control.png",y=JSON.parse('{"title":"远程交互式控制","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/远程交互控制.md","filePath":"指南/与生俱来/远程交互控制.md","lastUpdated":1722481721000}'),t={name:"指南/与生俱来/远程交互控制.md"},l=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}from"./chunks/framework.DB2UoSFq.js";const p="/youqu3/%E6%8C%87%E5%8D%97/%E4%B8%8E%E7%94%9F%E4%BF%B1%E6%9D%A5/remote_control.png",y=JSON.parse('{"title":"远程交互式控制","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/远程交互控制.md","filePath":"指南/与生俱来/远程交互控制.md","lastUpdated":1722506302000}'),t={name:"指南/与生俱来/远程交互控制.md"},l=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.C-njjJ_V.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.Vr1K94la.lean.js"
    similarity index 89%
    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.C-njjJ_V.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.Vr1K94la.lean.js"
    index e2557d9..98458c5 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.C-njjJ_V.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.Vr1K94la.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const p="/youqu3/%E6%8C%87%E5%8D%97/%E4%B8%8E%E7%94%9F%E4%BF%B1%E6%9D%A5/remote_control.png",y=JSON.parse('{"title":"远程交互式控制","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/远程交互控制.md","filePath":"指南/与生俱来/远程交互控制.md","lastUpdated":1722481721000}'),t={name:"指南/与生俱来/远程交互控制.md"},l=n("",15),h=[l];function e(k,r,d,E,o,g){return a(),i("div",null,h)}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}from"./chunks/framework.DB2UoSFq.js";const p="/youqu3/%E6%8C%87%E5%8D%97/%E4%B8%8E%E7%94%9F%E4%BF%B1%E6%9D%A5/remote_control.png",y=JSON.parse('{"title":"远程交互式控制","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/远程交互控制.md","filePath":"指南/与生俱来/远程交互控制.md","lastUpdated":1722506302000}'),t={name:"指南/与生俱来/远程交互控制.md"},l=n("",15),h=[l];function e(k,r,d,E,o,g){return a(),i("div",null,h)}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.wco41usZ.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.BNeTf-du.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.wco41usZ.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.BNeTf-du.js"
    index 545c9d3..472579e 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.wco41usZ.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.BNeTf-du.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/DBus自动化.md","filePath":"指南/可选功能/DBus自动化.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/DBus自动化.md","filePath":"指南/可选功能/DBus自动化.md","lastUpdated":1722506302000}'),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.wco41usZ.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.BNeTf-du.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.wco41usZ.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.BNeTf-du.lean.js"
    index 545c9d3..472579e 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.wco41usZ.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.BNeTf-du.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/DBus自动化.md","filePath":"指南/可选功能/DBus自动化.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/DBus自动化.md","filePath":"指南/可选功能/DBus自动化.md","lastUpdated":1722506302000}'),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.CSY9R7Yd.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.DN2UP1r7.js"
    similarity index 99%
    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.CSY9R7Yd.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.DN2UP1r7.js"
    index b21dab8..c67ff7f 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.CSY9R7Yd.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.DN2UP1r7.js"
    @@ -1,4 +1,4 @@
    -import{_ as a,c as s,o as i,U as t}from"./chunks/framework.DB2UoSFq.js";const E=JSON.parse('{"title":"GUI 自动化","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/GUI自动化.md","filePath":"指南/可选功能/GUI自动化.md","lastUpdated":1722481721000}'),e={name:"指南/可选功能/GUI自动化.md"},n=t(`

    GUI 自动化

    PyLinuxAuto 是专注于 Linux GUI 自动化测试的框架,提供丰富的键鼠控制及多种元素定位方案。

    安装

    bash
    pip install "youqu3[gui]"

    使用说明

    导入

    python
    from youqu3.gui import pylinuxauto

    键鼠控制

    python
    pylinuxauto.click()
    +import{_ as a,c as s,o as i,U as t}from"./chunks/framework.DB2UoSFq.js";const E=JSON.parse('{"title":"GUI 自动化","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/GUI自动化.md","filePath":"指南/可选功能/GUI自动化.md","lastUpdated":1722506302000}'),e={name:"指南/可选功能/GUI自动化.md"},n=t(`

    GUI 自动化

    PyLinuxAuto 是专注于 Linux GUI 自动化测试的框架,提供丰富的键鼠控制及多种元素定位方案。

    安装

    bash
    pip install "youqu3[gui]"

    使用说明

    导入

    python
    from youqu3.gui import pylinuxauto

    键鼠控制

    python
    pylinuxauto.click()
     pylinuxauto.double_click()

    了解更多...

    属性定位

    python
    pylinuxauto.find_element_by_attr_path("/dde-dock/Btn_文件管理器").click()

    了解更多...

    图像识别

    python
    pylinuxauto.find_element_by_image("~/Desktop/test.png").click()

    了解更多...

    OCR识别

    python
    pylinuxauto.find_element_by_ocr("中国").click()

    了解更多...

    相对位移定位

    python
    pylinuxauto.find_element_by_ui(
         appname="dde-file-manager",
         config_path="~/Desktop/ui.ini",
    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.CSY9R7Yd.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.DN2UP1r7.lean.js"
    similarity index 86%
    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.CSY9R7Yd.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.DN2UP1r7.lean.js"
    index 2af428c..d77f951 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.CSY9R7Yd.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.DN2UP1r7.lean.js"
    @@ -1 +1 @@
    -import{_ as a,c as s,o as i,U as t}from"./chunks/framework.DB2UoSFq.js";const E=JSON.parse('{"title":"GUI 自动化","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/GUI自动化.md","filePath":"指南/可选功能/GUI自动化.md","lastUpdated":1722481721000}'),e={name:"指南/可选功能/GUI自动化.md"},n=t("",22),h=[n];function l(p,o,r,d,k,c){return i(),s("div",null,h)}const g=a(e,[["render",l]]);export{E as __pageData,g as default};
    +import{_ as a,c as s,o as i,U as t}from"./chunks/framework.DB2UoSFq.js";const E=JSON.parse('{"title":"GUI 自动化","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/GUI自动化.md","filePath":"指南/可选功能/GUI自动化.md","lastUpdated":1722506302000}'),e={name:"指南/可选功能/GUI自动化.md"},n=t("",22),h=[n];function l(p,o,r,d,k,c){return i(),s("div",null,h)}const g=a(e,[["render",l]]);export{E as __pageData,g 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.BKhox56G.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.CoZmGoyj.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.BKhox56G.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.CoZmGoyj.js"
    index ae4fdda..ba324ac 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.BKhox56G.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.CoZmGoyj.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTML报告.md","filePath":"指南/可选功能/HTML报告.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTML报告.md","filePath":"指南/可选功能/HTML报告.md","lastUpdated":1722506302000}'),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.BKhox56G.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.CoZmGoyj.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.BKhox56G.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.CoZmGoyj.lean.js"
    index ae4fdda..ba324ac 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.BKhox56G.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.CoZmGoyj.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTML报告.md","filePath":"指南/可选功能/HTML报告.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTML报告.md","filePath":"指南/可选功能/HTML报告.md","lastUpdated":1722506302000}'),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.D8wjqQOA.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.DES6CjRT.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.D8wjqQOA.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.DES6CjRT.js"
    index c0d5325..82c1369 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.D8wjqQOA.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.DES6CjRT.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTTP自动化.md","filePath":"指南/可选功能/HTTP自动化.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTTP自动化.md","filePath":"指南/可选功能/HTTP自动化.md","lastUpdated":1722506302000}'),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.D8wjqQOA.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.DES6CjRT.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.D8wjqQOA.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.DES6CjRT.lean.js"
    index c0d5325..82c1369 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.D8wjqQOA.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.DES6CjRT.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTTP自动化.md","filePath":"指南/可选功能/HTTP自动化.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTTP自动化.md","filePath":"指南/可选功能/HTTP自动化.md","lastUpdated":1722506302000}'),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.CkQ82Lao.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.fcZh41mC.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.CkQ82Lao.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.fcZh41mC.js"
    index 19bb32b..a7418cc 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.CkQ82Lao.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.fcZh41mC.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/WebUI自动化.md","filePath":"指南/可选功能/WebUI自动化.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/WebUI自动化.md","filePath":"指南/可选功能/WebUI自动化.md","lastUpdated":1722506302000}'),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.CkQ82Lao.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.fcZh41mC.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.CkQ82Lao.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.fcZh41mC.lean.js"
    index 19bb32b..a7418cc 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.CkQ82Lao.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.fcZh41mC.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/WebUI自动化.md","filePath":"指南/可选功能/WebUI自动化.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/WebUI自动化.md","filePath":"指南/可选功能/WebUI自动化.md","lastUpdated":1722506302000}'),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.vIXMDVip.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.CweXrGHx.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.vIXMDVip.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.CweXrGHx.js"
    index f7a6c9a..d2daf97 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.vIXMDVip.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.CweXrGHx.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/其他插件.md","filePath":"指南/可选功能/其他插件.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/其他插件.md","filePath":"指南/可选功能/其他插件.md","lastUpdated":1722506302000}'),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.vIXMDVip.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.CweXrGHx.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.vIXMDVip.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.CweXrGHx.lean.js"
    index f7a6c9a..d2daf97 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.vIXMDVip.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.CweXrGHx.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/其他插件.md","filePath":"指南/可选功能/其他插件.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/其他插件.md","filePath":"指南/可选功能/其他插件.md","lastUpdated":1722506302000}'),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.BpfQUSyM.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.CE2PnM1e.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.BpfQUSyM.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.CE2PnM1e.js"
    index d89fa4b..893e0fb 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.BpfQUSyM.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.CE2PnM1e.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/用例录屏.md","filePath":"指南/可选功能/用例录屏.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/用例录屏.md","filePath":"指南/可选功能/用例录屏.md","lastUpdated":1722506302000}'),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.BpfQUSyM.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.CE2PnM1e.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.BpfQUSyM.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.CE2PnM1e.lean.js"
    index d89fa4b..893e0fb 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.BpfQUSyM.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.CE2PnM1e.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/用例录屏.md","filePath":"指南/可选功能/用例录屏.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/用例录屏.md","filePath":"指南/可选功能/用例录屏.md","lastUpdated":1722506302000}'),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.D-jsl6OJ.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.ADlfYemP.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.D-jsl6OJ.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.ADlfYemP.js"
    index 2ae9e02..d58d092 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.D-jsl6OJ.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.ADlfYemP.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/远程交互控制.md","filePath":"指南/可选功能/远程交互控制.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/远程交互控制.md","filePath":"指南/可选功能/远程交互控制.md","lastUpdated":1722506302000}'),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.D-jsl6OJ.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.ADlfYemP.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.D-jsl6OJ.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.ADlfYemP.lean.js"
    index 2ae9e02..d58d092 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.D-jsl6OJ.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.ADlfYemP.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/远程交互控制.md","filePath":"指南/可选功能/远程交互控制.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/远程交互控制.md","filePath":"指南/可选功能/远程交互控制.md","lastUpdated":1722506302000}'),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.c53OW6Yc.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.DSKJTnL-.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.c53OW6Yc.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.DSKJTnL-.js"
    index c92341b..2a1e5e7 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.c53OW6Yc.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.DSKJTnL-.js"
    @@ -1 +1 @@
    -import{_ as s,c as a,o as e,U as t}from"./chunks/framework.DB2UoSFq.js";const k=JSON.parse('{"title":"原生环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/原生环境.md","filePath":"指南/环境管理/原生环境.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const k=JSON.parse('{"title":"原生环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/原生环境.md","filePath":"指南/环境管理/原生环境.md","lastUpdated":1722506302000}'),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.c53OW6Yc.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.DSKJTnL-.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.c53OW6Yc.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.DSKJTnL-.lean.js" index 325388c..399de85 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.c53OW6Yc.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.DSKJTnL-.lean.js" @@ -1 +1 @@ -import{_ as s,c as a,o as e,U as t}from"./chunks/framework.DB2UoSFq.js";const k=JSON.parse('{"title":"原生环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/原生环境.md","filePath":"指南/环境管理/原生环境.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const k=JSON.parse('{"title":"原生环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/原生环境.md","filePath":"指南/环境管理/原生环境.md","lastUpdated":1722506302000}'),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.E2SphM8d.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.8cZqxyGg.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.E2SphM8d.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.8cZqxyGg.js" index 452fe3b..c128a16 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.E2SphM8d.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.8cZqxyGg.js" @@ -1,2 +1,2 @@ -import{_ as a,c as s,o as e,U as t}from"./chunks/framework.DB2UoSFq.js";const y=JSON.parse('{"title":"虚拟环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/虚拟环境.md","filePath":"指南/环境管理/虚拟环境.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const y=JSON.parse('{"title":"虚拟环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/虚拟环境.md","filePath":"指南/环境管理/虚拟环境.md","lastUpdated":1722506302000}'),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.E2SphM8d.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.8cZqxyGg.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.E2SphM8d.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.8cZqxyGg.lean.js" index 9b1cc2e..5bd2097 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.E2SphM8d.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.8cZqxyGg.lean.js" @@ -1 +1 @@ -import{_ as a,c as s,o as e,U as t}from"./chunks/framework.DB2UoSFq.js";const y=JSON.parse('{"title":"虚拟环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/虚拟环境.md","filePath":"指南/环境管理/虚拟环境.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const y=JSON.parse('{"title":"虚拟环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/虚拟环境.md","filePath":"指南/环境管理/虚拟环境.md","lastUpdated":1722506302000}'),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.CwaR93ey.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.DsHEPbWx.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.CwaR93ey.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.DsHEPbWx.js" index eaac9d6..ccfa2f7 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.CwaR93ey.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.DsHEPbWx.js" @@ -1 +1 @@ -import{_ as e,c as t,o,U as u}from"./chunks/framework.DB2UoSFq.js";const a="/youqu3/logo.png",f=JSON.parse('{"title":"","description":"","frontmatter":{"outline":false},"headers":[],"relativePath":"指南/简介/YouQu3是什么.md","filePath":"指南/简介/YouQu3是什么.md","lastUpdated":1722481721000}'),n={name:"指南/简介/YouQu3是什么.md"},i=u('

    YouQu3

    YouQu3

    Next-Gen Linux Autotest Framework.


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

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

    YouQu3 能做什么?

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

    ☑ 🌏 Web UI 自动化测试

    ☑ 🚌 Linux DBus 接口自动化测试

    ☑ 🚀 Linux 命令行自动化测试

    ☑ 🕷️ HTTP 接口自动化测试

    ☑ 🤙️ 。。。无限可能

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

    YouQu3

    YouQu3

    Next-Gen Linux Autotest Framework.


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

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

    YouQu3 能做什么?

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

    ☑ 🌏 Web UI 自动化测试

    ☑ 🚌 Linux DBus 接口自动化测试

    ☑ 🚀 Linux 命令行自动化测试

    ☑ 🕷️ HTTP 接口自动化测试

    ☑ 🤙️ 。。。无限可能

    ',13),r=[i];function l(p,s,_,c,h,d){return o(),t("div",null,r)}const g=e(n,[["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.CwaR93ey.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.DsHEPbWx.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.CwaR93ey.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.DsHEPbWx.lean.js" index 573845a..9cb71cb 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.CwaR93ey.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.DsHEPbWx.lean.js" @@ -1 +1 @@ -import{_ as e,c as t,o,U as u}from"./chunks/framework.DB2UoSFq.js";const a="/youqu3/logo.png",f=JSON.parse('{"title":"","description":"","frontmatter":{"outline":false},"headers":[],"relativePath":"指南/简介/YouQu3是什么.md","filePath":"指南/简介/YouQu3是什么.md","lastUpdated":1722481721000}'),n={name:"指南/简介/YouQu3是什么.md"},i=u("",13),r=[i];function l(p,s,_,c,h,d){return o(),t("div",null,r)}const g=e(n,[["render",l]]);export{f as __pageData,g as default}; +import{_ as e,c as t,o,U as u}from"./chunks/framework.DB2UoSFq.js";const a="/youqu3/logo.png",f=JSON.parse('{"title":"","description":"","frontmatter":{"outline":false},"headers":[],"relativePath":"指南/简介/YouQu3是什么.md","filePath":"指南/简介/YouQu3是什么.md","lastUpdated":1722506302000}'),n={name:"指南/简介/YouQu3是什么.md"},i=u("",13),r=[i];function l(p,s,_,c,h,d){return o(),t("div",null,r)}const g=e(n,[["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.DsVx6bRJ.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.DvBou8LY.js" similarity index 88% 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.DsVx6bRJ.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.DvBou8LY.js" index 8d8dae7..4715419 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.DsVx6bRJ.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.DvBou8LY.js" @@ -1,2 +1,2 @@ -import{_ as s}from"./chunks/init.CN3wm6Mq.js";import{_ as a,c as i,o as t,U as e}from"./chunks/framework.DB2UoSFq.js";const l="/youqu3/install.gif",y=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"指南/简介/快速开始.md","filePath":"指南/简介/快速开始.md","lastUpdated":1722481721000}'),p={name:"指南/简介/快速开始.md"},n=e('

    快速开始

    安装

    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 t(),i("div",null,h)}const v=a(p,[["render",o]]);export{y as __pageData,v as default}; +import{_ as s}from"./chunks/init.CN3wm6Mq.js";import{_ as a,c as i,o as t,U as e}from"./chunks/framework.DB2UoSFq.js";const l="/youqu3/install.gif",y=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"指南/简介/快速开始.md","filePath":"指南/简介/快速开始.md","lastUpdated":1722506302000}'),p={name:"指南/简介/快速开始.md"},n=e('

    快速开始

    安装

    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,u,k,g){return t(),i("div",null,h)}const v=a(p,[["render",o]]);export{y 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.DsVx6bRJ.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.DvBou8LY.lean.js" similarity index 75% 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.DsVx6bRJ.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.DvBou8LY.lean.js" index 486fbf7..6d93a8a 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.DsVx6bRJ.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.DvBou8LY.lean.js" @@ -1 +1 @@ -import{_ as s}from"./chunks/init.CN3wm6Mq.js";import{_ as a,c as i,o as t,U as e}from"./chunks/framework.DB2UoSFq.js";const l="/youqu3/install.gif",y=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"指南/简介/快速开始.md","filePath":"指南/简介/快速开始.md","lastUpdated":1722481721000}'),p={name:"指南/简介/快速开始.md"},n=e("",11),h=[n];function o(d,c,r,k,u,g){return t(),i("div",null,h)}const v=a(p,[["render",o]]);export{y as __pageData,v as default}; +import{_ as s}from"./chunks/init.CN3wm6Mq.js";import{_ as a,c as i,o as t,U as e}from"./chunks/framework.DB2UoSFq.js";const l="/youqu3/install.gif",y=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"指南/简介/快速开始.md","filePath":"指南/简介/快速开始.md","lastUpdated":1722506302000}'),p={name:"指南/简介/快速开始.md"},n=e("",11),h=[n];function o(d,c,r,u,k,g){return t(),i("div",null,h)}const v=a(p,[["render",o]]);export{y as __pageData,v 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.CjRdutwb.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.CjRdutwb.lean.js" deleted file mode 100644 index 4cac1dd..0000000 --- "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.CjRdutwb.lean.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as a,o as i,U as t}from"./chunks/framework.DB2UoSFq.js";const F=JSON.parse('{"title":"本地执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/本地执行.md","filePath":"指南/驱动执行/本地执行.md","lastUpdated":1722481721000}'),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{F 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.CjRdutwb.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.ousBb-3X.js" similarity index 87% 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.CjRdutwb.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.ousBb-3X.js" index acfe607..d2f7baa 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.CjRdutwb.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.ousBb-3X.js" @@ -1,4 +1,4 @@ -import{_ as s,c as a,o as i,U as t}from"./chunks/framework.DB2UoSFq.js";const F=JSON.parse('{"title":"本地执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/本地执行.md","filePath":"指南/驱动执行/本地执行.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const g=JSON.parse('{"title":"本地执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/本地执行.md","filePath":"指南/驱动执行/本地执行.md","lastUpdated":1722506302000}'),e={name:"指南/驱动执行/本地执行.md"},l=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.DB2UoSFq.js";const F=
             ...
             
         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{F 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),p=[l];function h(n,d,k,o,c,r){return i(),a("div",null,p)}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.ousBb-3X.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.ousBb-3X.lean.js" new file mode 100644 index 0000000..2c8b322 --- /dev/null +++ "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.ousBb-3X.lean.js" @@ -0,0 +1 @@ +import{_ as s,c as a,o as i,U as t}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"本地执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/本地执行.md","filePath":"指南/驱动执行/本地执行.md","lastUpdated":1722506302000}'),e={name:"指南/驱动执行/本地执行.md"},l=t("",40),p=[l];function h(n,d,k,o,c,r){return i(),a("div",null,p)}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.BY08CVGi.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.CTltswTz.js" similarity index 90% 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.BY08CVGi.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.CTltswTz.js" index ff83778..7fa1900 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.BY08CVGi.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.CTltswTz.js" @@ -1 +1 @@ -import{_ as a,c as s,o as t,U as e}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"自定义执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/自定义执行.md","filePath":"指南/驱动执行/自定义执行.md","lastUpdated":1722481721000}'),i={name:"指南/驱动执行/自定义执行.md"},o=e('

    自定义执行

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

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

    youqu-tags.txt

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

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

    txt
    id1 or id2 or id3

    youqu-keywords.txt

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

    youqu-keywords.txt 文件里面写关键词的表达式,如:

    txt
    id1 or id2 or id3

    案例

    PMS用例驱动

    youqu-pms-driver:从PMS测试单中爬取用例集,将用例 id 集合写入 youqu-tags.txt 文件。

    使用框架的前置钩子触发爬取动作生成 youqu-tags.txt 文件,框架自动加载并执行对应标签的用例。

    使用框架的后置钩子触发结果回填到 PMS 测试单。

    执行命令:

    bash
    youqu3 run --job-start "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx" --job-end "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx --send2pms"
    bash
    youqu3-cargo run --job-start "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx" --job-end "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx --send2pms"
    ',18),d=[o];function p(r,l,n,u,h,c){return t(),s("div",null,d)}const y=a(i,[["render",p]]);export{g as __pageData,y as default}; +import{_ as s,c as a,o as t,U as e}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"自定义执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/自定义执行.md","filePath":"指南/驱动执行/自定义执行.md","lastUpdated":1722506302000}'),i={name:"指南/驱动执行/自定义执行.md"},o=e('

    自定义执行

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

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

    youqu-tags.txt

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

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

    txt
    id1 or id2 or id3

    youqu-keywords.txt

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

    youqu-keywords.txt 文件里面写关键词的表达式,如:

    txt
    id1 or id2 or id3

    案例

    PMS用例驱动

    youqu-pms-driver:从PMS测试单中爬取用例集,将用例 id 集合写入 youqu-tags.txt 文件。

    使用框架的前置钩子触发爬取动作生成 youqu-tags.txt 文件,框架自动加载并执行对应标签的用例。

    使用框架的后置钩子触发结果回填到 PMS 测试单。

    执行命令:

    bash
    youqu3 run --job-start "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx" --job-end "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx --send2pms"
    bash
    youqu3-cargo run --job-start "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx" --job-end "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx --send2pms"
    ',18),d=[o];function p(r,n,l,u,h,c){return t(),a("div",null,d)}const y=s(i,[["render",p]]);export{g 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_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.BY08CVGi.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.CTltswTz.lean.js" similarity index 60% 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.BY08CVGi.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.CTltswTz.lean.js" index d9f5782..1b388af 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.BY08CVGi.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.CTltswTz.lean.js" @@ -1 +1 @@ -import{_ as a,c as s,o as t,U as e}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"自定义执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/自定义执行.md","filePath":"指南/驱动执行/自定义执行.md","lastUpdated":1722481721000}'),i={name:"指南/驱动执行/自定义执行.md"},o=e("",18),d=[o];function p(r,l,n,u,h,c){return t(),s("div",null,d)}const y=a(i,[["render",p]]);export{g as __pageData,y as default}; +import{_ as s,c as a,o as t,U as e}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"自定义执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/自定义执行.md","filePath":"指南/驱动执行/自定义执行.md","lastUpdated":1722506302000}'),i={name:"指南/驱动执行/自定义执行.md"},o=e("",18),d=[o];function p(r,n,l,u,h,c){return t(),a("div",null,d)}const y=s(i,[["render",p]]);export{g 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_\350\277\234\347\250\213\346\211\247\350\241\214.md.0nP48TV8.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.NNMPZm8s.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_\350\277\234\347\250\213\346\211\247\350\241\214.md.0nP48TV8.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.NNMPZm8s.js" index 1027499..766d496 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.0nP48TV8.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.NNMPZm8s.js" @@ -1 +1 @@ -import{_ as s,c as a,o as i,U as e}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"远程执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/远程执行.md","filePath":"指南/驱动执行/远程执行.md","lastUpdated":1722481721000}'),t={name:"指南/驱动执行/远程执行.md"},p=e('

    远程执行

    子命令

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

    远程执行使用子命令: remote

    bash
    $ youqu3 remote
    bash
    $ youqu3-cargo remote
    开启 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,c,n,r,k){return i(),a("div",null,l)}const b=s(t,[["render",o]]);export{g as __pageData,b as default}; +import{_ as s,c as a,o as i,U as e}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"远程执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/远程执行.md","filePath":"指南/驱动执行/远程执行.md","lastUpdated":1722506302000}'),t={name:"指南/驱动执行/远程执行.md"},l=e('

    远程执行

    子命令

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

    远程执行使用子命令: remote

    bash
    $ youqu3 remote
    bash
    $ youqu3-cargo remote
    开启 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),p=[l];function o(d,h,c,n,r,k){return i(),a("div",null,p)}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.0nP48TV8.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.NNMPZm8s.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.0nP48TV8.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.NNMPZm8s.lean.js" index 9f4e02d..1927f41 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.0nP48TV8.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.NNMPZm8s.lean.js" @@ -1 +1 @@ -import{_ as s,c as a,o as i,U as e}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"远程执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/远程执行.md","filePath":"指南/驱动执行/远程执行.md","lastUpdated":1722481721000}'),t={name:"指南/驱动执行/远程执行.md"},p=e("",17),l=[p];function o(d,h,c,n,r,k){return i(),a("div",null,l)}const b=s(t,[["render",o]]);export{g as __pageData,b as default}; +import{_ as s,c as a,o as i,U as e}from"./chunks/framework.DB2UoSFq.js";const g=JSON.parse('{"title":"远程执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/远程执行.md","filePath":"指南/驱动执行/远程执行.md","lastUpdated":1722506302000}'),t={name:"指南/驱动执行/远程执行.md"},l=e("",17),p=[l];function o(d,h,c,n,r,k){return i(),a("div",null,p)}const b=s(t,[["render",o]]);export{g as __pageData,b 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.D5ED0uXB.js" "b/assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.CQ4rehnz.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.D5ED0uXB.js" rename to "assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.CQ4rehnz.js" index e1507c4..0f91c5b 100644 --- "a/assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.D5ED0uXB.js" +++ "b/assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.CQ4rehnz.js" @@ -1 +1 @@ -import{_ as t,c as e,o as r,U as d}from"./chunks/framework.DB2UoSFq.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/插件列表.md","filePath":"插件/插件列表.md","lastUpdated":1722481721000}'),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 可视化驱动🚧
    18youqu-html-rpc基于 RPC 服务的测试报告生成插件✔️
    ',2),o=[n];function u(l,h,y,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.DB2UoSFq.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/插件列表.md","filePath":"插件/插件列表.md","lastUpdated":1722506302000}'),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 可视化驱动🚧
    18youqu-html-rpc基于 RPC 服务的测试报告生成插件✔️
    ',2),o=[n];function u(l,h,y,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.D5ED0uXB.lean.js" "b/assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.CQ4rehnz.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.D5ED0uXB.lean.js" rename to "assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.CQ4rehnz.lean.js" index 8eae44c..8ca77c3 100644 --- "a/assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.D5ED0uXB.lean.js" +++ "b/assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.CQ4rehnz.lean.js" @@ -1 +1 @@ -import{_ as t,c as e,o as r,U as d}from"./chunks/framework.DB2UoSFq.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/插件列表.md","filePath":"插件/插件列表.md","lastUpdated":1722481721000}'),a={name:"插件/插件列表.md"},n=d("",2),o=[n];function u(l,h,y,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.DB2UoSFq.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"插件/插件列表.md","filePath":"插件/插件列表.md","lastUpdated":1722506302000}'),a={name:"插件/插件列表.md"},n=d("",2),o=[n];function u(l,h,y,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/\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.CP7q3UeK.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.DpLzMHgc.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.CP7q3UeK.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.DpLzMHgc.js" index 572b2e1..252694a 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.CP7q3UeK.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.DpLzMHgc.js" @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as l}from"./chunks/framework.DB2UoSFq.js";const F=JSON.parse('{"title":"UOS 自动化测试方法套件(UMTK)","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试方法套件.md","filePath":"规划/UOS自动化测试方法套件.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const F=JSON.parse('{"title":"UOS 自动化测试方法套件(UMTK)","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试方法套件.md","filePath":"规划/UOS自动化测试方法套件.md","lastUpdated":1722506302000}'),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.CP7q3UeK.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.DpLzMHgc.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.CP7q3UeK.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.DpLzMHgc.lean.js"
    index 1f01835..1263e15 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.CP7q3UeK.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.DpLzMHgc.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as l}from"./chunks/framework.DB2UoSFq.js";const F=JSON.parse('{"title":"UOS 自动化测试方法套件(UMTK)","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试方法套件.md","filePath":"规划/UOS自动化测试方法套件.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const F=JSON.parse('{"title":"UOS 自动化测试方法套件(UMTK)","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试方法套件.md","filePath":"规划/UOS自动化测试方法套件.md","lastUpdated":1722506302000}'),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.CDQxImSe.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.C6Y4hw-3.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.CDQxImSe.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.C6Y4hw-3.js"
    index 97ec7ce..981bbfb 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.CDQxImSe.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.C6Y4hw-3.js"
    @@ -1,4 +1,4 @@
    -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const o=JSON.parse('{"title":"UOS 自动化测试用例","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试用例.md","filePath":"规划/UOS自动化测试用例.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const o=JSON.parse('{"title":"UOS 自动化测试用例","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试用例.md","filePath":"规划/UOS自动化测试用例.md","lastUpdated":1722506302000}'),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.CDQxImSe.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.C6Y4hw-3.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.CDQxImSe.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.C6Y4hw-3.lean.js"
    index f2c367a..a42ba24 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.CDQxImSe.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.C6Y4hw-3.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const o=JSON.parse('{"title":"UOS 自动化测试用例","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试用例.md","filePath":"规划/UOS自动化测试用例.md","lastUpdated":1722481721000}'),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.DB2UoSFq.js";const o=JSON.parse('{"title":"UOS 自动化测试用例","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/UOS自动化测试用例.md","filePath":"规划/UOS自动化测试用例.md","lastUpdated":1722506302000}'),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.C9SVK84-.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.OCP75O8e.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.C9SVK84-.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.OCP75O8e.js"
    index 014dc9b..56b87e5 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.C9SVK84-.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.OCP75O8e.js"
    @@ -1,4 +1,4 @@
    -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const l="/youqu3/%E8%AE%BE%E8%AE%A1/YouQu3%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1.drawio.png",h="/youqu3/%E8%AE%BE%E8%AE%A1/YouQu3%E6%9E%B6%E6%9E%84%E6%80%BB%E8%A7%88.drawio.png",E=JSON.parse('{"title":"YouQu3 架构设计规划","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/YouQu3架构设计规划.md","filePath":"规划/YouQu3架构设计规划.md","lastUpdated":1722481721000}'),e={name:"规划/YouQu3架构设计规划.md"},t=n('

    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 n}from"./chunks/framework.DB2UoSFq.js";const l="/youqu3/%E8%AE%BE%E8%AE%A1/YouQu3%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1.drawio.png",h="/youqu3/%E8%AE%BE%E8%AE%A1/YouQu3%E6%9E%B6%E6%9E%84%E6%80%BB%E8%A7%88.drawio.png",E=JSON.parse('{"title":"YouQu3 架构设计规划","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/YouQu3架构设计规划.md","filePath":"规划/YouQu3架构设计规划.md","lastUpdated":1722506302000}'),e={name:"规划/YouQu3架构设计规划.md"},t=n('

    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.C9SVK84-.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.OCP75O8e.lean.js"
    similarity index 90%
    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.C9SVK84-.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.OCP75O8e.lean.js"
    index c3aeaf0..94d1bea 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.C9SVK84-.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.OCP75O8e.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const l="/youqu3/%E8%AE%BE%E8%AE%A1/YouQu3%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1.drawio.png",h="/youqu3/%E8%AE%BE%E8%AE%A1/YouQu3%E6%9E%B6%E6%9E%84%E6%80%BB%E8%A7%88.drawio.png",E=JSON.parse('{"title":"YouQu3 架构设计规划","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/YouQu3架构设计规划.md","filePath":"规划/YouQu3架构设计规划.md","lastUpdated":1722481721000}'),e={name:"规划/YouQu3架构设计规划.md"},t=n("",81),p=[t];function k(d,r,o,c,g,y){return a(),i("div",null,p)}const u=s(e,[["render",k]]);export{E as __pageData,u as default};
    +import{_ as s,c as i,o as a,U as n}from"./chunks/framework.DB2UoSFq.js";const l="/youqu3/%E8%AE%BE%E8%AE%A1/YouQu3%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1.drawio.png",h="/youqu3/%E8%AE%BE%E8%AE%A1/YouQu3%E6%9E%B6%E6%9E%84%E6%80%BB%E8%A7%88.drawio.png",E=JSON.parse('{"title":"YouQu3 架构设计规划","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/YouQu3架构设计规划.md","filePath":"规划/YouQu3架构设计规划.md","lastUpdated":1722506302000}'),e={name:"规划/YouQu3架构设计规划.md"},t=n("",81),p=[t];function k(d,r,o,c,g,y){return a(),i("div",null,p)}const u=s(e,[["render",k]]);export{E as __pageData,u as default};
    diff --git a/hashmap.json b/hashmap.json
    index d8d257e..263abd2 100644
    --- a/hashmap.json
    +++ b/hashmap.json
    @@ -1 +1 @@
    -{"指南_环境管理_原生环境.md":"c53OW6Yc","指南_驱动执行_远程执行.md":"0nP48TV8","实践_配置模块.md":"B8xvQ7s-","指南_可选功能_webui自动化.md":"CkQ82Lao","指南_可选功能_其他插件.md":"vIXMDVip","指南_可选功能_用例录屏.md":"BpfQUSyM","指南_可选功能_远程交互控制.md":"D-jsl6OJ","指南_环境管理_虚拟环境.md":"E2SphM8d","实践_工程创建.md":"CEbpbhG1","指南_驱动执行_自定义执行.md":"BY08CVGi","指南_与生俱来_前后钩子.md":"BOdewZBn","指南_与生俱来_断言语句.md":"QPUOGbQS","指南_简介_youqu3是什么.md":"CwaR93ey","插件_插件列表.md":"D5ED0uXB","规划_youqu3架构设计规划.md":"C9SVK84-","实践_简介.md":"BH5RfU1H","实践_用例开发.md":"B1K8cEop","指南_与生俱来_json报告.md":"kgapLy4Z","指南_简介_快速开始.md":"DsVx6bRJ","指南_与生俱来_命令行交互.md":"05C5s7jI","指南_可选功能_http自动化.md":"D8wjqQOA","实践_依赖管理.md":"KnqyJe_d","指南_可选功能_html报告.md":"BKhox56G","指南_与生俱来_全自动日志.md":"BzQXJSiU","指南_可选功能_gui自动化.md":"CSY9R7Yd","指南_与生俱来_远程交互控制.md":"C-njjJ_V","指南_可选功能_dbus自动化.md":"wco41usZ","指南_与生俱来_标签化管理.md":"D6YGsBJk","实践_方法开发.md":"Pi9b8NLI","规划_uos自动化测试方法套件.md":"CP7q3UeK","指南_与生俱来_动态等待.md":"CVacz-37","指南_驱动执行_本地执行.md":"CjRdutwb","指南_与生俱来_脚手架工具.md":"Dz2AiDDo","index.md":"CwOla-ZS","规划_uos自动化测试用例.md":"CDQxImSe"}
    +{"实践_工程创建.md":"DxxIOgWb","指南_环境管理_原生环境.md":"DSKJTnL-","指南_可选功能_dbus自动化.md":"BNeTf-du","指南_与生俱来_动态等待.md":"CXJSwiEL","实践_简介.md":"BndrkXrm","实践_方法开发.md":"CPCZKS3A","实践_依赖管理.md":"YROidQsd","指南_与生俱来_脚手架工具.md":"i_k3Y0oH","index.md":"DaWK2gBu","指南_可选功能_gui自动化.md":"DN2UP1r7","指南_可选功能_http自动化.md":"DES6CjRT","指南_与生俱来_命令行交互.md":"1kLbBdVe","指南_驱动执行_自定义执行.md":"CTltswTz","指南_与生俱来_标签化管理.md":"C8yulHa6","实践_用例开发.md":"C9U8TJiv","规划_uos自动化测试方法套件.md":"DpLzMHgc","规划_uos自动化测试用例.md":"C6Y4hw-3","指南_可选功能_远程交互控制.md":"ADlfYemP","指南_环境管理_虚拟环境.md":"8cZqxyGg","指南_与生俱来_前后钩子.md":"t7JPiBsf","实践_配置模块.md":"DEfceMjg","指南_简介_youqu3是什么.md":"DsHEPbWx","指南_可选功能_webui自动化.md":"fcZh41mC","指南_可选功能_用例录屏.md":"CE2PnM1e","规划_youqu3架构设计规划.md":"OCP75O8e","指南_可选功能_其他插件.md":"CweXrGHx","指南_简介_快速开始.md":"DvBou8LY","指南_与生俱来_全自动日志.md":"BHFXWNaq","指南_驱动执行_本地执行.md":"ousBb-3X","指南_驱动执行_远程执行.md":"NNMPZm8s","指南_与生俱来_远程交互控制.md":"Vr1K94la","指南_与生俱来_json报告.md":"C8Y-pg-e","指南_可选功能_html报告.md":"CoZmGoyj","指南_与生俱来_断言语句.md":"DmB4CNKW","插件_插件列表.md":"CQ4rehnz"}
    diff --git a/index.html b/index.html
    index 1b7628d..45c4786 100644
    --- a/index.html
    +++ b/index.html
    @@ -8,18 +8,18 @@
         
         
         
    -    
    +    
         
    -    
    +    
         
    -    
    +    
         
         
         
       
       
         
    Skip to content

    YouQu3

    Next-Gen Linux Autotest Framework

    Easy to use, ready for production.

    YouQu3

    Contributors

    - + \ No newline at end of file diff --git "a/\345\256\236\350\267\265/\344\276\235\350\265\226\347\256\241\347\220\206.html" "b/\345\256\236\350\267\265/\344\276\235\350\265\226\347\256\241\347\220\206.html" index a705cc8..2b3958f 100644 --- "a/\345\256\236\350\267\265/\344\276\235\350\265\226\347\256\241\347\220\206.html" +++ "b/\345\256\236\350\267\265/\344\276\235\350\265\226\347\256\241\347\220\206.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/\345\267\245\347\250\213\345\210\233\345\273\272.html" "b/\345\256\236\350\267\265/\345\267\245\347\250\213\345\210\233\345\273\272.html" index 7920e19..c5834f4 100644 --- "a/\345\256\236\350\267\265/\345\267\245\347\250\213\345\210\233\345\273\272.html" +++ "b/\345\256\236\350\267\265/\345\267\245\347\250\213\345\210\233\345\273\272.html" @@ -8,18 +8,20 @@ - + - + - + + -
    Skip to content
    📔 阅读量:

    工程创建

    - +
    Skip to content
    📔 阅读量:

    工程创建

    创建一个工程目录:

    bash
    mkdir my_autotest

    使用脚手架工具创建用例工程:

    bash
    cd my_autotest/
    +youqu3 init

    + \ 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 b82ce06..ef669aa 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,67 @@ - + - + - + -
    Skip to content
    📔 阅读量:

    方法开发

    - +
    Skip to content
    📔 阅读量:

    方法开发

    方法模块路径

    shell
    my_autotest
    +├─ case
    +   ├─ assert_res
    +   └─ README.md
    +   ├─ base_case.py
    +   ├─ test_mycase_001.py
    +   └─ test_mycase_002.py
    +├─ method      <--方法模块
    +   ├─ image_res
    +   └─ README.md
    +   ├─ static_res
    +   └─ README.md
    +   ├─ assert_method.py
    +   ├─ base_method.py
    +   ├─ my_autotest_method.py
    +   └─ ui.ini
    +├─ .gitignore
    +├─ README.md
    +├─ config.py  
    +├─ conftest.py
    +├─ mycase.csv
    +├─ pytest.ini
    +├─ requirements.txt
    +└─ ruff.toml

    以 dde-dock 方法举例

    dde_dock_method.py

    python
    from funnylog2.config import config as log_config
    +from youqu3 import log
    +from youqu3.gui import pylinuxauto
    +
    +log_config.CLASS_NAME_ENDSWITH = "Method"
    +
    +@log
    +class DdeDockMethod():
    +
    +    @staticmethod
    +    def click_dde_file_manager_on_dock_by_attr():
    +        """在任务栏点击文件管理器"""
    +        pylinuxauto.find_element_by_attr_path("/dde-dock/Btn_文件管理器").click()
    +	
    +    @staticmethod
    +    def right_click_dde_file_manager_on_dock_by_attr():
    +        """在任务栏右键点击文件管理器"""
    +        pylinuxauto.find_element_by_attr_path("/dde-dock/Btn_文件管理器").right_click()

    遵循 PO 设计模式:一个页面一个类,一个元素一个方法

    实践规范

    方法文件名称

    • 小驼峰命名。
    • 应用名称开头,如果应用涉及的页面较多需要做划分,可以用页面的名称。
    • method 结尾。

    类名称

    • 大驼峰命名。
    • 应用名称开头,如果应用涉及的页面较多需要做划分,可以用页面的名称。
    • Method 结尾。

    方法名称

    python
    def {动词}_{对象}_{位置}_{元素定位方式}():
    +    ...
    • 动词开头。

      方法动词开头列表

      名称单词
      左键点击click
      右键点击right_click
      双击double_click
      移动move_to
      拖动drag
      新建new
      拖动到drag_to
    • 对象,能够直接表示元素对象即可。

    • 位置,对象所在的位置,或者是哪个应用的。

    • 元素定位方式

      方法动词开头列表

      名称表达式
      属性定位by_attr
      图像识别by_image
      OCR识别by_ocr
      相对位置定位by_ui
      键鼠操作by_mk

    函数注释

    python
    def func():
    +    """函数注释"""

    日志

    全自动输出日志,只需要一个类装饰器。

    python
    from funnylog2.config import config as log_config
    +from youqu3 import log
    +
    +log_config.CLASS_NAME_ENDSWITH = "Method"
    +
    +@log
    +class DdeDockMethod():
    +    ...
    + \ 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 745b77f..64170d3 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,67 @@ - + - + - + -
    Skip to content
    📔 阅读量:

    用例开发

    - +
    Skip to content
    📔 阅读量:

    用例开发

    用例模块路径

    shell
    my_autotest
    +├─ case    <--用例模块
    +   ├─ assert_res
    +   └─ README.md
    +   ├─ base_case.py
    +   ├─ test_mycase_001.py
    +   └─ test_mycase_002.py v
    +├─ method      
    +   ├─ image_res
    +   └─ README.md
    +   ├─ static_res
    +   └─ README.md
    +   ├─ assert_method.py
    +   ├─ base_method.py
    +   ├─ my_autotest_method.py
    +   └─ ui.ini
    +├─ .gitignore
    +├─ README.md
    +├─ config.py  
    +├─ conftest.py
    +├─ mycase.csv
    +├─ pytest.ini
    +├─ requirements.txt
    +└─ ruff.toml

    以 dde-file-manager 用例举例

    case/base_case.py

    python
    from method.assert_method import AssertMethod
    +
    +
    +class BaseCase(AssertMethod):
    +    ...

    test_dfm_001.py

    python
    from youqu3 import sleep
    +
    +from case.base_case import BaseCase
    +from method.dde_dock_method import DdeDockMethod
    +
    +
    +class TestDfm(BaseCase):
    +
    +    def test_dfm_1159151(self):
    +        """任务栏右键启动文件管理器"""
    +        # 右键点击任务栏上的文件管理器
    +        DdeDockMethod.right_click_dde_file_manager_on_dock_by_attr()
    +        # 点击右键菜单中的“打开”
    +        DdeDockMethod.click_open_in_right_menu_by_mk()
    +        sleep(2)
    +        # 断言
    +        self.assert_process_exist("dde-file-manager")
    +
    +    def teardown_method(self):
    +        """teardown"""
    +        DdeDockMethod.kill_process("dde-file-manager")

    实践规范

    用例文件名称

    bash
    test_{case_name}_{case_id}.py
    • 小驼峰命名。
    • test_ 开头。
    • case_id 结尾。

    类名称

    • 大驼峰命名。
    • Test 开头。
    • 用例名称 结尾,所有用例可以使用相同的类名。
    • 继承 BaseCase

    用例函数

    python
    def test_{case_name}_{case_id}():
    +    ...

    用例注释

    python
    def test_{case_name}_{case_id}():
    +    """用例标题"""    <--用例注释 

    CSV文件

    • CSV文件名称对应用例文件名称的 case_name{case_name}.csv
    • 第一列写 case_id
    + \ No newline at end of file diff --git "a/\345\256\236\350\267\265/\347\256\200\344\273\213.html" "b/\345\256\236\350\267\265/\347\256\200\344\273\213.html" index f48dc7f..f5cfe1a 100644 --- "a/\345\256\236\350\267\265/\347\256\200\344\273\213.html" +++ "b/\345\256\236\350\267\265/\347\256\200\344\273\213.html" @@ -8,18 +8,18 @@ - + - + - + -
    Skip to content
    📔 阅读量:

    从零开始构建自动化工程

    我们将指导如何基于 YouQu3 从零开始构建一个完成的自动化用例工程。

    按照以下章节:

    • 工程创建:使用 YouQu3 官方提供的脚手架工具,快速创建一个自动化用例工程模板。

    • 配置模块:介绍自动化用例工程配置模块如何管理配置。

    • 方法开发:使用 PO 设计理念进行方法封装,方法类如何组织,提高可维护性。

    • 用例开发:按照业务流程调用方法进行用例代码开发,Fixture 如何编写。

    • 依赖管理:如何管理自动化用例工程的依赖项。

    - +
    Skip to content
    📔 阅读量:

    从零开始构建自动化工程

    我们将指导如何基于 YouQu3 从零开始构建一个完成的自动化用例工程。

    按照以下章节:

    • 工程创建:使用 YouQu3 官方提供的脚手架工具,快速创建一个自动化用例工程模板。
    • 方法开发:使用 PO 设计理念进行方法封装,方法类如何组织,提高可维护性。
    • 用例开发:按照业务流程调用方法进行用例代码开发,Fixture 如何编写。
    • 配置模块:介绍自动化用例工程配置模块如何管理配置。
    • 依赖管理:如何管理自动化用例工程的依赖项。
    + \ No newline at end of file diff --git "a/\345\256\236\350\267\265/\351\205\215\347\275\256\346\250\241\345\235\227.html" "b/\345\256\236\350\267\265/\351\205\215\347\275\256\346\250\241\345\235\227.html" index 36a414f..01da232 100644 --- "a/\345\256\236\350\267\265/\351\205\215\347\275\256\346\250\241\345\235\227.html" +++ "b/\345\256\236\350\267\265/\351\205\215\347\275\256\346\250\241\345\235\227.html" @@ -8,18 +8,56 @@ - + - + - + -
    Skip to content
    📔 阅读量:

    配置模块

    - +
    Skip to content
    📔 阅读量:

    配置模块

    配置模块路径

    shell
    my_autotest
    +├─ case
    +   ├─ assert_res
    +   └─ README.md
    +   ├─ base_case.py
    +   ├─ test_mycase_001.py
    +   └─ test_mycase_002.py
    +├─ method
    +   ├─ image_res
    +   └─ README.md
    +   ├─ static_res
    +   └─ README.md
    +   ├─ assert_method.py
    +   ├─ base_method.py
    +   ├─ my_autotest_method.py
    +   └─ ui.ini
    +├─ .gitignore
    +├─ README.md
    +├─ config.py  <--工程配置
    +├─ conftest.py
    +├─ mycase.csv
    +├─ pytest.ini
    +├─ requirements.txt
    +└─ ruff.toml

    config.py

    python
    import pathlib
    +
    +
    +class _Config:
    +
    +    ROOTDIR = pathlib.Path(__file__).parent
    +    ASSERT_RES = ROOTDIR / "case/assert_res"
    +    IMAGE_RES = ROOTDIR / "method/image_res"
    +    STATIC_RES = ROOTDIR / "method/static_res"
    +
    +
    +config = _Config()

    可以根据需要在里面添加配置。

    代码中调用

    python
    from config import config
    +
    +config.ROOTDIR

    调用YouQu3的配置

    python
    from youqu3 import setting
    +
    +setting.IS_X11
    + \ 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 ae05c13..a8853ea 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 5dafbe7..ca3d118 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 7dda7f0..c1b6d50 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 708b186..3b6d543 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 715eacb..c34bf04 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 34b43f7..265736f 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 @@ - + - + - + @@ -365,8 +365,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 9ed5a1f..5e3006f 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 2b5a2ae..68d32dc 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,20 +8,20 @@ - + - + - + -
Skip to content
📔 阅读量:

脚手架工具

使用子命令 init 创建用例工程,工程遵循完整的 PO 设计模式,让你可以专注于用例和方法的编写维护。

  • 创建一个目录
bash
mkdir my_autotest
  • 使用脚手架功能创建用例工程
bash
cd my_autotest/
-youqu3 init

- +
Skip to content
📔 阅读量:

脚手架工具

使用子命令 init 创建用例工程,工程遵循完整的 PO 设计模式,让你可以专注于用例和方法的编写维护。

  • 创建一个目录
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/\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 3b88444..bb106dd 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 6b3175e..7d468e6 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 c326204..4aa2172 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,11 +8,11 @@ - + - + - + @@ -23,8 +23,8 @@ appname="dde-file-manager", config_path="~/Desktop/ui.ini", btn_name="最大化按钮" -).click()

了解更多...

- +).click()

了解更多...

+ \ 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 27be936..e474de2 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 e7f6023..f44199c 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 eec742b..85523b3 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 e4355e5..8a9230c 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 8c02cc1..8b41e93 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 5bd5f44..43421d0 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 ac73274..61b31c2 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 753855a..3547b11 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 3203e90..e627321 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

Next-Gen Linux Autotest Framework.


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

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

YouQu3 能做什么?

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

☑ 🌏 Web UI 自动化测试

☑ 🚌 Linux DBus 接口自动化测试

☑ 🚀 Linux 命令行自动化测试

☑ 🕷️ HTTP 接口自动化测试

☑ 🤙️ 。。。无限可能

- +
Skip to content
📔 阅读量:

YouQu3

YouQu3

Next-Gen Linux Autotest 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 61da2ab..821660f 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,20 +8,20 @@ - + - + - + -
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

- +
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 21bcadb..e6e71a3 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 5929704..a7b91be 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 文件里面写标签的表达式,如:

txt
id1 or id2 or id3

youqu-keywords.txt

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

youqu-keywords.txt 文件里面写关键词的表达式,如:

txt
id1 or id2 or id3

案例

PMS用例驱动

youqu-pms-driver:从PMS测试单中爬取用例集,将用例 id 集合写入 youqu-tags.txt 文件。

使用框架的前置钩子触发爬取动作生成 youqu-tags.txt 文件,框架自动加载并执行对应标签的用例。

使用框架的后置钩子触发结果回填到 PMS 测试单。

执行命令:

bash
youqu3 run --job-start "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx" --job-end "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx --send2pms"
bash
youqu3-cargo run --job-start "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx" --job-end "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx --send2pms"
- +
Skip to content
📔 阅读量:

自定义执行

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

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

youqu-tags.txt

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

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

txt
id1 or id2 or id3

youqu-keywords.txt

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

youqu-keywords.txt 文件里面写关键词的表达式,如:

txt
id1 or id2 or id3

案例

PMS用例驱动

youqu-pms-driver:从PMS测试单中爬取用例集,将用例 id 集合写入 youqu-tags.txt 文件。

使用框架的前置钩子触发爬取动作生成 youqu-tags.txt 文件,框架自动加载并执行对应标签的用例。

使用框架的后置钩子触发结果回填到 PMS 测试单。

执行命令:

bash
youqu3 run --job-start "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx" --job-end "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx --send2pms"
bash
youqu3-cargo run --job-start "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx" --job-end "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx --send2pms"
+ \ 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 6c1d617..a912edc 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
bash
$ youqu3-cargo remote
开启 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
bash
$ youqu3-cargo remote
开启 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/\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 21e547d..7cb231f 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 可视化驱动🚧
18youqu-html-rpc基于 RPC 服务的测试报告生成插件✔️

最后更新于:

- +
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 可视化驱动🚧
18youqu-html-rpc基于 RPC 服务的测试报告生成插件✔️

最后更新于:

+ \ 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 666c4dc..9bf00d7 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 a4b9150..c84d54a 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 0745c8c..1ae82f8 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